You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2023/01/18 11:30:23 UTC

[skywalking-java] branch test/ci/spring6 updated (6102aac18c -> 18d4a17761)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch test/ci/spring6
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git


 discard 6102aac18c Add Spring 6 to test case
     new 18d4a17761 Add Spring 6 to test case

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (6102aac18c)
            \
             N -- N -- N   refs/heads/test/ci/spring6 (18d4a17761)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/en/setup/service-agent/java-agent/Plugin-list.md | 2 ++
 1 file changed, 2 insertions(+)


[skywalking-java] 01/01: Add Spring 6 to test case

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch test/ci/spring6
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git

commit 18d4a177611e97f938b25c38dc17df9b708f5c77
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Wed Jan 18 19:30:17 2023 +0800

    Add Spring 6 to test case
---
 .github/actions/run/action.yml                     |   2 +-
 .github/workflows/ci.yaml                          |   5 +-
 .github/workflows/plugins-jdk17-test.0.yaml        |   3 +-
 .github/workflows/plugins-test.0.yaml              |   2 +-
 .github/workflows/plugins-test.1.yaml              |   2 +-
 .github/workflows/plugins-test.2.yaml              |   2 +-
 .github/workflows/plugins-test.3.yaml              |   2 +-
 .github/workflows/plugins-tomcat10-test.0.yaml     |   2 +-
 .../v3/define/AbstractSpring3Instrumentation.java  |   6 +-
 .../v4/define/AbstractSpring4Instrumentation.java  |  10 +-
 .../ControllerForLowVersionInstrumentation.java    |  12 +-
 ...RestControllerForLowVersionInstrumentation.java |  12 +-
 .../v4/define/RestControllerInstrumentation.java   |  12 +-
 .../AbstractSpring5ReactiveInstrumentation.java    |   7 +-
 .../AbstractSpring5ReactiveInstrumentationV2.java  |   7 +-
 .../pom.xml                                        |  34 +-
 .../mvc/v6/ControllerConstructorInterceptor.java   |  58 ++++
 .../plugin/spring/mvc/v6/GetBeanInterceptor.java   |  68 ++++
 .../plugin/spring/mvc/v6/InvokeInterceptor.java    |  88 +++++
 .../define/AbstractControllerInstrumentation.java  | 113 +++++++
 .../v6/define/AbstractSpring5Instrumentation.java} |   6 +-
 .../mvc/v6/define/ControllerInstrumentation.java}  |  11 +-
 .../v6/define/HandlerMethodInstrumentation.java    |  69 ++++
 .../v6}/define/RestControllerInstrumentation.java  |  13 +-
 .../AbstractReactiveControllerInstrumentation.java | 120 +++++++
 .../AbstractSpring5ReactiveInstrumentation.java    |   2 +-
 .../AbstractSpring5ReactiveInstrumentationV2.java  |   2 +-
 .../InvocableHandlerMethodInstrumentation.java     |  63 ++++
 .../ReactiveControllerInstrumentation.java}        |  11 +-
 .../ReactiveRestControllerInstrumentation.java}    |  15 +-
 .../src/main/resources/skywalking-plugin.def       |  22 ++
 .../spring-plugins/mvc-annotation-commons/pom.xml  |   6 +
 .../apm/plugin/spring/mvc/commons/RequestUtil.java |  29 ++
 .../interceptor/AbstractMethodInterceptor.java     |  59 +++-
 apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml  |   2 +
 .../ResponseExtractorFutureInstrumentation.java    |   7 +
 .../async/define/RestTemplateInstrumentation.java  |   7 +
 .../sync/define/RestTemplateInstrumentation.java   |   7 +
 .../pom.xml                                        |  31 +-
 .../helper/RestTemplateRuntimeContextHelper.java   |  53 +++
 .../v6x/sync/RestExecuteInterceptor.java           |  70 ++++
 .../v6x/sync/RestRequestInterceptor.java           |  60 ++++
 .../v6x/sync/RestResponseInterceptor.java          |  57 ++++
 .../sync/define/RestTemplateInstrumentation.java   |  15 +-
 .../src/main/resources/skywalking-plugin.def       |  17 +
 .../setup/service-agent/java-agent/Plugin-list.md  |   2 +
 .../tomcat-container/src/main/docker/catalina.sh   |   2 +-
 .../plugin/scenarios/spring-4.3.x-scenario/pom.xml |  11 +-
 .../apm/testcase/restapi/RestCaseController.java   |   1 -
 .../spring-6.x-scenario/config/expectedData.yaml   | 375 +++++++++++++++++++++
 .../spring-6.x-scenario/configuration.yml          |  23 ++
 .../pom.xml                                        |  25 +-
 .../skywalking/apm/testcase/entity/User.java       |  40 ++-
 .../testcase/implinterface/TestCaseController.java |  20 +-
 .../testcase/implinterface/TestCaseInterface.java  |  20 +-
 .../apm/testcase/inherit/ChildController.java      |  17 +-
 .../apm/testcase/inherit/ParentController.java     |  19 +-
 .../apm/testcase/restapi/RestCaseController.java   |   1 -
 .../resttemplate/RestTemplateController.java       |  85 +++++
 .../apm/testcase/spring3/CaseController.java       |  28 +-
 .../spring3/component/TestComponentBean.java       |  16 +-
 .../testcase/spring3/dao/TestRepositoryBean.java   |  16 +-
 .../testcase/spring3/service/TestServiceBean.java  |  25 +-
 .../src/main/resources/log4j2.xml                  |  30 ++
 .../src/main/webapp/WEB-INF/spring-mvc-servlet.xml |  30 ++
 .../src/main/webapp/WEB-INF/web.xml                |  35 ++
 .../spring-6.x-scenario/support-version.list       |  17 +
 67 files changed, 1805 insertions(+), 234 deletions(-)

diff --git a/.github/actions/run/action.yml b/.github/actions/run/action.yml
index 57b711de0a..28f72df800 100644
--- a/.github/actions/run/action.yml
+++ b/.github/actions/run/action.yml
@@ -51,5 +51,5 @@ runs:
       shell: bash
       run: |
         echo "::group::Run Plugin Test ${{ inputs.test_case }}"
-        bash test/plugin/run.sh --image_version=${{ inputs.java_version }}-1.0.0 ${{ inputs.test_case }}
+        bash test/plugin/run.sh ${{ inputs.test_case }}
         echo "::endgroup::"
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index b643ada247..e6536b873c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -51,10 +51,7 @@ jobs:
       fail-fast: true
       matrix:
         os: [ ubuntu, macos, windows ]
-        java-version: [ 8 ]
-        include:
-          - os: ubuntu
-            java-version: 11
+        java-version: [ 17 ]
     steps:
       - uses: actions/checkout@v2
         with:
diff --git a/.github/workflows/plugins-jdk17-test.0.yaml b/.github/workflows/plugins-jdk17-test.0.yaml
index d496c158ab..c52fbc2183 100644
--- a/.github/workflows/plugins-jdk17-test.0.yaml
+++ b/.github/workflows/plugins-jdk17-test.0.yaml
@@ -48,7 +48,7 @@ jobs:
         uses: ./.github/actions/build
         with:
           base_image_java: eclipse-temurin:17-jdk
-          base_image_tomcat: tomcat:8.5-jdk17-openjdk
+          base_image_tomcat: tomcat:10.1-jdk17-temurin
 
   test:
     needs: [ build ]
@@ -59,6 +59,7 @@ jobs:
       matrix:
         case:
           - jdk17-with-gson-scenario
+          - spring-6.x-scenario
 #          TODO: We can't test it just yet, because it requires a Skywalking release
 #          - resttemplate-6.x-scenario
     steps:
diff --git a/.github/workflows/plugins-test.0.yaml b/.github/workflows/plugins-test.0.yaml
index ab768b74a3..4bbfe3d3ad 100644
--- a/.github/workflows/plugins-test.0.yaml
+++ b/.github/workflows/plugins-test.0.yaml
@@ -95,7 +95,7 @@ jobs:
       - uses: actions/setup-java@v2
         with:
           distribution: adopt
-          java-version: 8
+          java-version: 17
       - name: Run Plugin Test
         uses: ./.github/actions/run
         with:
diff --git a/.github/workflows/plugins-test.1.yaml b/.github/workflows/plugins-test.1.yaml
index 2b4bfa926c..9fe83e303b 100644
--- a/.github/workflows/plugins-test.1.yaml
+++ b/.github/workflows/plugins-test.1.yaml
@@ -88,7 +88,7 @@ jobs:
       - uses: actions/setup-java@v2
         with:
           distribution: adopt
-          java-version: 8
+          java-version: 17
       - name: Run Plugin Test
         uses: ./.github/actions/run
         with:
diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml
index cb076b5fe1..88f0ea6406 100644
--- a/.github/workflows/plugins-test.2.yaml
+++ b/.github/workflows/plugins-test.2.yaml
@@ -87,7 +87,7 @@ jobs:
       - uses: actions/setup-java@v2
         with:
           distribution: adopt
-          java-version: 8
+          java-version: 17
       - name: Run Plugin Test
         uses: ./.github/actions/run
         with:
diff --git a/.github/workflows/plugins-test.3.yaml b/.github/workflows/plugins-test.3.yaml
index 0a8cdab1d9..54c3f4154b 100644
--- a/.github/workflows/plugins-test.3.yaml
+++ b/.github/workflows/plugins-test.3.yaml
@@ -115,7 +115,7 @@ jobs:
       - uses: actions/setup-java@v2
         with:
           distribution: adopt
-          java-version: 8
+          java-version: 17
       - name: Install Oracle Libs
         if: matrix.case == 'oracle-scenario'
         run: |
diff --git a/.github/workflows/plugins-tomcat10-test.0.yaml b/.github/workflows/plugins-tomcat10-test.0.yaml
index cc16810d28..dc65b1a514 100644
--- a/.github/workflows/plugins-tomcat10-test.0.yaml
+++ b/.github/workflows/plugins-tomcat10-test.0.yaml
@@ -65,7 +65,7 @@ jobs:
       - uses: actions/setup-java@v2
         with:
           distribution: adopt
-          java-version: 8
+          java-version: 17
       - name: Run Plugin Test
         uses: ./.github/actions/run
         with:
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java
index 3ecf23eaa4..e0db56ada5 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java
@@ -26,10 +26,12 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInst
  */
 public abstract class AbstractSpring3Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
 
-    public static final String WITHNESS_CLASSES = "org.springframework.web.servlet.view.xslt.AbstractXsltView";
+    public static final String[] WITHNESS_CLASSES = new String[] {
+        "org.springframework.web.servlet.view.xslt.AbstractXsltView"
+    };
 
     @Override
     protected final String[] witnessClasses() {
-        return new String[] {WITHNESS_CLASSES};
+        return WITHNESS_CLASSES;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
index e17f47f810..a99a94592a 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
@@ -21,13 +21,13 @@ package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
 
 public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+    public static final String[] WITHNESS_CLASSES = new String[] {
+        "org.springframework.cache.interceptor.SimpleKey",
+        "org.springframework.cache.interceptor.DefaultKeyGenerator",
+    };
 
     @Override
     protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+        return WITHNESS_CLASSES;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/ControllerForLowVersionInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/ControllerForLowVersionInstrumentation.java
index c27cfc860e..47cb682e30 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/ControllerForLowVersionInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/ControllerForLowVersionInstrumentation.java
@@ -47,11 +47,13 @@ public class ControllerForLowVersionInstrumentation extends AbstractControllerIn
 
     @Override
     protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator",
-            WITNESS_CLASSES_LOW_VERSION
-        };
+        final String[] classes = new String[WITHNESS_CLASSES.length + 1];
+        int i = 0;
+        for (; i < WITHNESS_CLASSES.length; i++) {
+            classes[i] = WITHNESS_CLASSES[i];
+        }
+        classes[i++] = WITNESS_CLASSES_LOW_VERSION;
+        return classes;
     }
 
     @Override
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerForLowVersionInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerForLowVersionInstrumentation.java
index 55e62ec55f..e8751f5142 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerForLowVersionInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerForLowVersionInstrumentation.java
@@ -47,11 +47,13 @@ public class RestControllerForLowVersionInstrumentation extends AbstractControll
 
     @Override
     protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator",
-            WITNESS_CLASSES_LOW_VERSION
-        };
+        final String[] classes = new String[WITHNESS_CLASSES.length + 1];
+        int i = 0;
+        for (; i < WITHNESS_CLASSES.length; i++) {
+            classes[i] = WITHNESS_CLASSES[i];
+        }
+        classes[i++] = WITNESS_CLASSES_LOW_VERSION;
+        return classes;
     }
 
     @Override
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
index 5db1b79980..c0a0106aea 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
@@ -31,10 +31,12 @@ public class RestControllerInstrumentation extends AbstractControllerInstrumenta
 
     @Override
     protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator",
-            WITNESS_CLASSES_HIGH_VERSION
-        };
+        final String[] classes = new String[WITHNESS_CLASSES.length + 1];
+        int i = 0;
+        for (; i < WITHNESS_CLASSES.length; i++) {
+            classes[i] = WITHNESS_CLASSES[i];
+        }
+        classes[i++] = WITNESS_CLASSES_HIGH_VERSION;
+        return classes;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
index 5753debefa..af35d97a90 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
 
 public abstract class AbstractSpring5ReactiveInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITNESS_CLASSES = "org.springframework.web.reactive.result.method.InvocableHandlerMethod";
+    public static final String[] WITNESS_CLASSES = new String[] {
+        "org.springframework.web.reactive.result.method.InvocableHandlerMethod",
+        "org.springframework.web.client.AsyncRequestCallback"
+    };
 
     @Override
     protected final String[] witnessClasses() {
-        return new String[] {WITNESS_CLASSES};
+        return WITNESS_CLASSES;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
index 52adbb77f1..4c3259973a 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.ClassInstanceMethodsEnhancePluginDefineV2;
 
 public abstract class AbstractSpring5ReactiveInstrumentationV2 extends ClassInstanceMethodsEnhancePluginDefineV2 {
-    public static final String WITNESS_CLASSES = "org.springframework.web.reactive.result.method.InvocableHandlerMethod";
+    public static final String[] WITNESS_CLASSES = new String[] {
+        "org.springframework.web.reactive.result.method.InvocableHandlerMethod",
+        "org.springframework.web.client.AsyncRequestCallback"
+    };
 
     @Override
     protected final String[] witnessClasses() {
-        return new String[] {WITNESS_CLASSES};
+        return WITNESS_CLASSES;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/pom.xml
similarity index 64%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/pom.xml
index 70871bbe38..8f588bdfac 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/pom.xml
@@ -6,14 +6,13 @@
   ~ (the "License"); you may not use this file except in compliance with
   ~ the License.  You may obtain a copy of the License at
   ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~      http://www.apache.org/licenses/LICENSE-2.0
   ~
   ~ Unless required by applicable law or agreed to in writing, software
   ~ distributed under the License is distributed on an "AS IS" BASIS,
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  ~
+  ~  See the License for the specific language governing permissions and
+  ~  limitations under the License.
   -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -24,16 +23,17 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>apm-springmvc-annotation-commons</artifactId>
+    <artifactId>apm-springmvc-annotation-6.x-plugin</artifactId>
     <packaging>jar</packaging>
 
-    <name>mvc-annotation-commons</name>
+    <name>mvc-annotation-6.x-plugin</name>
     <url>http://maven.apache.org</url>
 
     <properties>
-        <spring-core.version>4.3.10.RELEASE</spring-core.version>
-        <spring-webmvc.version>4.3.8.RELEASE</spring-webmvc.version>
-        <javax-servlet-api.version>3.0.1</javax-servlet-api.version>
+        <spring-core.version>6.0.0</spring-core.version>
+        <spring-webmvc.version>6.0.0</spring-webmvc.version>
+        <jakarta-servlet-api.version>6.0.0</jakarta-servlet-api.version>
+        <spring-webflux.version>6.0.0</spring-webflux.version>
     </properties>
 
     <dependencies>
@@ -49,16 +49,22 @@
             <version>${spring-webmvc.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>apm-springmvc-annotation-commons</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
-            <artifactId>spring-web</artifactId>
-            <version>5.2.4.RELEASE</version>
+            <artifactId>spring-webflux</artifactId>
+            <version>${spring-webflux.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>${javax-servlet-api.version}</version>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>${jakarta-servlet-api.version}</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/ControllerConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/ControllerConstructorInterceptor.java
new file mode 100644
index 0000000000..6157e9fdbe
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/ControllerConstructorInterceptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6;
+
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache;
+import org.apache.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * The <code>ControllerConstructorInterceptor</code> intercepts the Controller's constructor, in order to acquire the
+ * mapping annotation, if exist.
+ * <p>
+ * But, you can see we only use the first mapping value, <B>Why?</B>
+ * <p>
+ * Right now, we intercept the controller by annotation as you known, so we CAN'T know which uri patten is actually
+ * matched. Even we know, that costs a lot.
+ * <p>
+ * If we want to resolve that, we must intercept the Spring MVC core codes, that is not a good choice for now.
+ * <p>
+ * Comment by @wu-sheng
+ */
+public class ControllerConstructorInterceptor implements InstanceConstructorInterceptor {
+
+    @Override
+    public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
+        String basePath = "";
+        RequestMapping basePathRequestMapping = AnnotationUtils.findAnnotation(objInst.getClass(), RequestMapping.class);
+        if (basePathRequestMapping != null) {
+            if (basePathRequestMapping.value().length > 0) {
+                basePath = basePathRequestMapping.value()[0];
+            } else if (basePathRequestMapping.path().length > 0) {
+                basePath = basePathRequestMapping.path()[0];
+            }
+        }
+        EnhanceRequireObjectCache enhanceRequireObjectCache = new EnhanceRequireObjectCache();
+        enhanceRequireObjectCache.setPathMappingCache(new PathMappingCache(basePath));
+        objInst.setSkyWalkingDynamicField(enhanceRequireObjectCache);
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/GetBeanInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/GetBeanInterceptor.java
new file mode 100644
index 0000000000..33a588c68a
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/GetBeanInterceptor.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.REQUEST_KEY_IN_RUNTIME_CONTEXT;
+import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.RESPONSE_KEY_IN_RUNTIME_CONTEXT;
+
+/**
+ * {@link GetBeanInterceptor} pass the {@link NativeWebRequest} object into the {@link
+ * org.springframework.stereotype.Controller} object.
+ */
+public class GetBeanInterceptor implements InstanceMethodsAroundInterceptor {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+                             MethodInterceptResult result) throws Throwable {
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+                              Object ret) throws Throwable {
+        if (ret instanceof EnhancedInstance) {
+            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (requestAttributes != null) {
+                ContextManager.getRuntimeContext()
+                              .put(
+                                  REQUEST_KEY_IN_RUNTIME_CONTEXT,
+                                  requestAttributes.getRequest()
+                              );
+                ContextManager.getRuntimeContext()
+                              .put(
+                                  RESPONSE_KEY_IN_RUNTIME_CONTEXT,
+                                  requestAttributes.getResponse()
+                              );
+            }
+        }
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
+                                      Class<?>[] argumentsTypes, Throwable t) {
+
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/InvokeInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/InvokeInterceptor.java
new file mode 100644
index 0000000000..da9a33d939
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/InvokeInterceptor.java
@@ -0,0 +1,88 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.RuntimeContext;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.InstanceMethodsAroundInterceptorV2;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext;
+import org.springframework.http.HttpStatusCode;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.lang.reflect.Method;
+
+import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.REACTIVE_ASYNC_SPAN_IN_RUNTIME_CONTEXT;
+import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.REQUEST_KEY_IN_RUNTIME_CONTEXT;
+import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.RESPONSE_KEY_IN_RUNTIME_CONTEXT;
+
+public class InvokeInterceptor implements InstanceMethodsAroundInterceptorV2 {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInvocationContext context) throws Throwable {
+        ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
+        final ServerHttpResponse response = exchange.getResponse();
+        /**
+         * First, we put the slot in the RuntimeContext,
+         * as well as the MethodInvocationContext (MIC),
+         * so that we can access it in the {@link org.apache.skywalking.apm.plugin.spring.mvc.v6.InvokeInterceptor#afterMethod}
+         * Then we fetch the slot from {@link org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor.AbstractMethodInterceptor#afterMethod}
+         * and fulfill the slot with the real AbstractSpan.
+         * Afterwards, we can safely remove the RuntimeContext.
+         * Finally, when the lambda executes in the {@link reactor.core.publisher.Mono#doFinally},
+         * ref of span could be acquired from MIC.
+         */
+        AbstractSpan[] ref = new AbstractSpan[1];
+        RuntimeContext runtimeContext = ContextManager.getRuntimeContext();
+        runtimeContext.put(REACTIVE_ASYNC_SPAN_IN_RUNTIME_CONTEXT, ref);
+        runtimeContext.put(RESPONSE_KEY_IN_RUNTIME_CONTEXT, response);
+        runtimeContext.put(REQUEST_KEY_IN_RUNTIME_CONTEXT, exchange.getRequest());
+        context.setContext(ref);
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret, MethodInvocationContext context) throws Throwable {
+        ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
+        return ((Mono) ret).doFinally(s -> {
+            Object ctx = context.getContext();
+            if (ctx == null) {
+                return;
+            }
+            AbstractSpan span = ((AbstractSpan[]) ctx)[0];
+            if (span == null) {
+                return;
+            }
+            HttpStatusCode httpStatus = exchange.getResponse().getStatusCode();
+            if (httpStatus != null) {
+                Tags.HTTP_RESPONSE_STATUS_CODE.set(span, httpStatus.value());
+                if (httpStatus.isError()) {
+                    span.errorOccurred();
+                }
+            }
+            span.asyncFinish();
+        });
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t, MethodInvocationContext context) {
+
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractControllerInstrumentation.java
new file mode 100644
index 0000000000..bf5fb5fc2e
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractControllerInstrumentation.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.DeclaredInstanceMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants;
+
+import static net.bytebuddy.matcher.ElementMatchers.any;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.apache.skywalking.apm.agent.core.plugin.match.MethodInheritanceAnnotationMatcher.byMethodInheritanceAnnotationMatcher;
+
+/**
+ * {@link ControllerInstrumentation} enhance all constructor and method annotated with
+ * <code>org.springframework.web.bind.annotation.RequestMapping</code> that class has
+ * <code>org.springframework.stereotype.Controller</code> annotation.
+ *
+ * <code>ControllerConstructorInterceptor</code> set the controller base path to
+ * dynamic field before execute constructor.
+ *
+ * <code>org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor.RequestMappingMethodInterceptor</code> get the request path
+ * from dynamic field first, if not found, <code>RequestMappingMethodInterceptor</code> generate request path  that
+ * combine the path value of current annotation on current method and the base path and set the new path to the dynamic
+ * filed
+ */
+public abstract class AbstractControllerInstrumentation extends AbstractSpring5Instrumentation {
+    @Override
+    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[] {
+            new ConstructorInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getConstructorMatcher() {
+                    return any();
+                }
+
+                @Override
+                public String getConstructorInterceptor() {
+                    return "org.apache.skywalking.apm.plugin.spring.mvc.v6.ControllerConstructorInterceptor";
+                }
+            }
+        };
+    }
+
+    @Override
+    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
+        return new InstanceMethodsInterceptPoint[] {
+            new DeclaredInstanceMethodsInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.RequestMapping"));
+                }
+
+                @Override
+                public String getMethodsInterceptor() {
+                    return Constants.REQUEST_MAPPING_METHOD_INTERCEPTOR;
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new DeclaredInstanceMethodsInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.GetMapping"))
+                        .or(byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.PostMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.PutMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.DeleteMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(named("org.springframework.web.bind.annotation.PatchMapping")));
+                }
+
+                @Override
+                public String getMethodsInterceptor() {
+                    return Constants.REST_MAPPING_METHOD_INTERCEPTOR;
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override
+    protected ClassMatch enhanceClass() {
+        return ClassAnnotationMatch.byClassAnnotationMatch(getEnhanceAnnotations());
+    }
+
+    protected abstract String[] getEnhanceAnnotations();
+
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractSpring5Instrumentation.java
similarity index 82%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractSpring5Instrumentation.java
index 5753debefa..305355885a 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/AbstractSpring5Instrumentation.java
@@ -15,12 +15,12 @@
  *  limitations under the License.
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define;
 
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
 
-public abstract class AbstractSpring5ReactiveInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITNESS_CLASSES = "org.springframework.web.reactive.result.method.InvocableHandlerMethod";
+public abstract class AbstractSpring5Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
+    public static final String WITNESS_CLASSES = "org.springframework.web.servlet.resource.HttpResource";
 
     @Override
     protected final String[] witnessClasses() {
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/ControllerInstrumentation.java
similarity index 61%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/ControllerInstrumentation.java
index 5753debefa..04c5d963b6 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/ControllerInstrumentation.java
@@ -15,15 +15,14 @@
  *  limitations under the License.
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+public class ControllerInstrumentation extends AbstractControllerInstrumentation {
 
-public abstract class AbstractSpring5ReactiveInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITNESS_CLASSES = "org.springframework.web.reactive.result.method.InvocableHandlerMethod";
+    public static final String ENHANCE_ANNOTATION = "org.springframework.stereotype.Controller";
 
     @Override
-    protected final String[] witnessClasses() {
-        return new String[] {WITNESS_CLASSES};
+    protected String[] getEnhanceAnnotations() {
+        return new String[] {ENHANCE_ANNOTATION};
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/HandlerMethodInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/HandlerMethodInstrumentation.java
new file mode 100644
index 0000000000..81b43a53bf
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/HandlerMethodInstrumentation.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+/**
+ * {@link HandlerMethodInstrumentation} intercept the <code>getBean</code> method in the
+ * <code>org.springframework.web.method.HandlerMethod</code> class.
+ */
+public class HandlerMethodInstrumentation extends AbstractSpring5Instrumentation {
+
+    public static final String ENHANCE_METHOD = "getBean";
+    public static final String ENHANCE_CLASS = "org.springframework.web.method.HandlerMethod";
+
+    @Override
+    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[0];
+    }
+
+    @Override
+    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
+        return new InstanceMethodsInterceptPoint[] {
+            new InstanceMethodsInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return named(ENHANCE_METHOD);
+                }
+
+                @Override
+                public String getMethodsInterceptor() {
+                    return "org.apache.skywalking.apm.plugin.spring.mvc.v6.GetBeanInterceptor";
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override
+    protected ClassMatch enhanceClass() {
+        return NameMatch.byName(ENHANCE_CLASS);
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/RestControllerInstrumentation.java
similarity index 73%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/RestControllerInstrumentation.java
index 5db1b79980..27a416de09 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/RestControllerInstrumentation.java
@@ -16,25 +16,14 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define;
 
 public class RestControllerInstrumentation extends AbstractControllerInstrumentation {
 
-    public static final String WITNESS_CLASSES_HIGH_VERSION = "org.springframework.http.HttpRange";
-
     public static final String ENHANCE_ANNOTATION = "org.springframework.web.bind.annotation.RestController";
 
     @Override
     protected String[] getEnhanceAnnotations() {
         return new String[] {ENHANCE_ANNOTATION};
     }
-
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator",
-            WITNESS_CLASSES_HIGH_VERSION
-        };
-    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractReactiveControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractReactiveControllerInstrumentation.java
new file mode 100644
index 0000000000..b7c06823ed
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractReactiveControllerInstrumentation.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.DeclaredInstanceMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants;
+import org.apache.skywalking.apm.plugin.spring.mvc.v6.define.ControllerInstrumentation;
+
+import static net.bytebuddy.matcher.ElementMatchers.any;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.apache.skywalking.apm.agent.core.plugin.match.MethodInheritanceAnnotationMatcher.byMethodInheritanceAnnotationMatcher;
+
+/**
+ * {@link ControllerInstrumentation} enhance all constructor and method annotated with
+ * <code>org.springframework.web.bind.annotation.RequestMapping</code> that class has
+ * <code>org.springframework.stereotype.Controller</code> annotation.
+ *
+ * <code>ControllerConstructorInterceptor</code> set the controller base path to
+ * dynamic field before execute constructor.
+ *
+ * <code>org.apache.skywalking.apm.plugin.spring.mvc.v4.RequestMappingMethodInterceptor</code> get the request path
+ * from dynamic field first, if not found, <code>RequestMappingMethodInterceptor</code> generate request path  that
+ * combine the path value of current annotation on current method and the base path and set the new path to the dynamic
+ * filed
+ */
+public abstract class AbstractReactiveControllerInstrumentation extends AbstractSpring5ReactiveInstrumentation {
+    @Override
+    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[] {
+            new ConstructorInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getConstructorMatcher() {
+                    return any();
+                }
+
+                @Override
+                public String getConstructorInterceptor() {
+                    return "org.apache.skywalking.apm.plugin.spring.mvc.v6.ControllerConstructorInterceptor";
+                }
+            }
+        };
+    }
+
+    @Override
+    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
+        return new InstanceMethodsInterceptPoint[] {
+            new DeclaredInstanceMethodsInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return byMethodInheritanceAnnotationMatcher(
+                        named("org.springframework.web.bind.annotation.RequestMapping"));
+                }
+
+                @Override
+                public String getMethodsInterceptor() {
+                    return Constants.REQUEST_MAPPING_METHOD_INTERCEPTOR;
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new DeclaredInstanceMethodsInterceptPoint() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return byMethodInheritanceAnnotationMatcher(
+                        named("org.springframework.web.bind.annotation.GetMapping"))
+                        .or(byMethodInheritanceAnnotationMatcher(
+                            named("org.springframework.web.bind.annotation.PostMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(
+                            named("org.springframework.web.bind.annotation.PutMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(
+                            named("org.springframework.web.bind.annotation.DeleteMapping")))
+                        .or(byMethodInheritanceAnnotationMatcher(
+                            named("org.springframework.web.bind.annotation.PatchMapping")));
+                }
+
+                @Override
+                public String getMethodsInterceptor() {
+                    return Constants.REST_MAPPING_METHOD_INTERCEPTOR;
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override
+    protected ClassMatch enhanceClass() {
+        return ClassAnnotationMatch.byClassAnnotationMatch(getEnhanceAnnotations());
+    }
+
+    protected abstract String[] getEnhanceAnnotations();
+
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentation.java
similarity index 95%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentation.java
index 5753debefa..2336f99682 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentation.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
 
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
 
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
similarity index 95%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
index 52adbb77f1..7582fbd9fd 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/AbstractSpring5ReactiveInstrumentationV2.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
 
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.ClassInstanceMethodsEnhancePluginDefineV2;
 
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/InvocableHandlerMethodInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/InvocableHandlerMethodInstrumentation.java
new file mode 100644
index 0000000000..b2a54c30b0
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/InvocableHandlerMethodInstrumentation.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType;
+import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
+
+public class InvocableHandlerMethodInstrumentation extends AbstractSpring5ReactiveInstrumentationV2 {
+    @Override
+    protected ClassMatch enhanceClass() {
+        return byName("org.springframework.web.reactive.result.method.InvocableHandlerMethod");
+    }
+
+    @Override
+    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[0];
+    }
+
+    @Override
+    public InstanceMethodsInterceptV2Point[] getInstanceMethodsInterceptV2Points() {
+        return new InstanceMethodsInterceptV2Point[] {
+            new InstanceMethodsInterceptV2Point() {
+                @Override
+                public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                    return named("invoke").and(
+                        takesArgumentWithType(0, "org.springframework.web.server.ServerWebExchange"));
+                }
+
+                @Override
+                public String getMethodsInterceptorV2() {
+                    return "org.apache.skywalking.apm.plugin.spring.mvc.v6.InvokeInterceptor";
+                }
+
+                @Override
+                public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveControllerInstrumentation.java
similarity index 62%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveControllerInstrumentation.java
index 5753debefa..8e68eb1eea 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v5/define/reactive/AbstractSpring5ReactiveInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveControllerInstrumentation.java
@@ -15,15 +15,14 @@
  *  limitations under the License.
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v5.define.reactive;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+public class ReactiveControllerInstrumentation extends AbstractReactiveControllerInstrumentation {
 
-public abstract class AbstractSpring5ReactiveInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITNESS_CLASSES = "org.springframework.web.reactive.result.method.InvocableHandlerMethod";
+    public static final String ENHANCE_ANNOTATION = "org.springframework.stereotype.Controller";
 
     @Override
-    protected final String[] witnessClasses() {
-        return new String[] {WITNESS_CLASSES};
+    protected String[] getEnhanceAnnotations() {
+        return new String[] {ENHANCE_ANNOTATION};
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveRestControllerInstrumentation.java
similarity index 67%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveRestControllerInstrumentation.java
index 5db1b79980..0e50c2da9b 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v6/define/reactive/ReactiveRestControllerInstrumentation.java
@@ -16,11 +16,9 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive;
 
-public class RestControllerInstrumentation extends AbstractControllerInstrumentation {
-
-    public static final String WITNESS_CLASSES_HIGH_VERSION = "org.springframework.http.HttpRange";
+public class ReactiveRestControllerInstrumentation extends AbstractReactiveControllerInstrumentation {
 
     public static final String ENHANCE_ANNOTATION = "org.springframework.web.bind.annotation.RestController";
 
@@ -28,13 +26,4 @@ public class RestControllerInstrumentation extends AbstractControllerInstrumenta
     protected String[] getEnhanceAnnotations() {
         return new String[] {ENHANCE_ANNOTATION};
     }
-
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator",
-            WITNESS_CLASSES_HIGH_VERSION
-        };
-    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/resources/skywalking-plugin.def
new file mode 100644
index 0000000000..b81ab94224
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-6.x-plugin/src/main/resources/skywalking-plugin.def
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.ControllerInstrumentation
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.RestControllerInstrumentation
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.HandlerMethodInstrumentation
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive.InvocableHandlerMethodInstrumentation
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive.ReactiveControllerInstrumentation
+spring-mvc-annotation-6.x=org.apache.skywalking.apm.plugin.spring.mvc.v6.define.reactive.ReactiveRestControllerInstrumentation
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
index 70871bbe38..425b361727 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
@@ -61,5 +61,11 @@
             <version>${javax-servlet-api.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.0.0</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/RequestUtil.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/RequestUtil.java
index 640e04ce85..b278c8f9e2 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/RequestUtil.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/RequestUtil.java
@@ -42,6 +42,16 @@ public class RequestUtil {
         }
     }
 
+    public static void collectHttpParam(jakarta.servlet.http.HttpServletRequest request, AbstractSpan span) {
+        final Map<String, String[]> parameterMap = request.getParameterMap();
+        if (parameterMap != null && !parameterMap.isEmpty()) {
+            String tagValue = CollectionUtil.toString(parameterMap);
+            tagValue = SpringMVCPluginConfig.Plugin.Http.HTTP_PARAMS_LENGTH_THRESHOLD > 0 ?
+                    StringUtil.cut(tagValue, SpringMVCPluginConfig.Plugin.Http.HTTP_PARAMS_LENGTH_THRESHOLD) : tagValue;
+            Tags.HTTP.PARAMS.set(span, tagValue);
+        }
+    }
+
     public static void collectHttpParam(ServerHttpRequest request, AbstractSpan span) {
         Map<String, String[]> parameterMap = new HashMap<>(request.getQueryParams().size());
         request.getQueryParams().forEach((key, value) -> {
@@ -74,6 +84,25 @@ public class RequestUtil {
         collectHttpHeaders(headersList, span);
     }
 
+    public static void collectHttpHeaders(jakarta.servlet.http.HttpServletRequest request, AbstractSpan span) {
+        final List<String> headersList = new ArrayList<>(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.size());
+        SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.stream()
+                .filter(
+                        headerName -> request.getHeaders(headerName) != null)
+                .forEach(headerName -> {
+                    Enumeration<String> headerValues = request.getHeaders(
+                            headerName);
+                    List<String> valueList = Collections.list(
+                            headerValues);
+                    if (!CollectionUtil.isEmpty(valueList)) {
+                        String headerValue = valueList.toString();
+                        headersList.add(headerName + "=" + headerValue);
+                    }
+                });
+
+        collectHttpHeaders(headersList, span);
+    }
+
     public static void collectHttpHeaders(ServerHttpRequest request, AbstractSpan span) {
         final List<String> headersList = new ArrayList<>(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.size());
         SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.stream()
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
index a2af3ef54c..e47fa87da6 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
@@ -25,6 +25,8 @@ import org.apache.skywalking.apm.agent.core.context.RuntimeContext;
 import org.apache.skywalking.apm.agent.core.context.tag.Tags;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.agent.core.logging.api.ILog;
+import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
@@ -53,21 +55,36 @@ import static org.apache.skywalking.apm.plugin.spring.mvc.commons.Constants.RESP
  * the abstract method interceptor
  */
 public abstract class AbstractMethodInterceptor implements InstanceMethodsAroundInterceptor {
-
+    private static final ILog LOGGER = LogManager.getLogger(AbstractMethodInterceptor.class);
     private static boolean IS_SERVLET_GET_STATUS_METHOD_EXIST;
+    private static boolean IS_JAKARTA_SERVLET_GET_STATUS_METHOD_EXIST;
     private static final String SERVLET_RESPONSE_CLASS = "javax.servlet.http.HttpServletResponse";
+    private static final String JAKARTA_SERVLET_RESPONSE_CLASS = "jakarta.servlet.http.HttpServletResponse";
     private static final String GET_STATUS_METHOD = "getStatus";
 
     private static boolean IN_SERVLET_CONTAINER;
+    private static boolean IS_JAVAX = false;
+    private static boolean IS_JAKARTA = false;
 
     static {
         IS_SERVLET_GET_STATUS_METHOD_EXIST = MethodUtil.isMethodExist(
                 AbstractMethodInterceptor.class.getClassLoader(), SERVLET_RESPONSE_CLASS, GET_STATUS_METHOD);
+        IS_JAKARTA_SERVLET_GET_STATUS_METHOD_EXIST = MethodUtil.isMethodExist(
+                AbstractMethodInterceptor.class.getClassLoader(),
+            JAKARTA_SERVLET_RESPONSE_CLASS, GET_STATUS_METHOD);
         try {
             Class.forName(SERVLET_RESPONSE_CLASS, true, AbstractMethodInterceptor.class.getClassLoader());
             IN_SERVLET_CONTAINER = true;
+            IS_JAVAX = true;
         } catch (Exception ignore) {
-            IN_SERVLET_CONTAINER = false;
+            try {
+                Class.forName(
+                    JAKARTA_SERVLET_RESPONSE_CLASS, true, AbstractMethodInterceptor.class.getClassLoader());
+                IN_SERVLET_CONTAINER = true;
+                IS_JAKARTA = true;
+            } catch (Exception ignore2) {
+                IN_SERVLET_CONTAINER = false;
+            }
         }
     }
 
@@ -94,7 +111,7 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
             if (stackDepth == null) {
                 final ContextCarrier contextCarrier = new ContextCarrier();
 
-                if (IN_SERVLET_CONTAINER && HttpServletRequest.class.isAssignableFrom(request.getClass())) {
+                if (IN_SERVLET_CONTAINER && IS_JAVAX && HttpServletRequest.class.isAssignableFrom(request.getClass())) {
                     final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
                     CarrierItem next = contextCarrier.items();
                     while (next.hasNext()) {
@@ -117,6 +134,32 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
                     if (!CollectionUtil.isEmpty(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS)) {
                         RequestUtil.collectHttpHeaders(httpServletRequest, span);
                     }
+                } else if (IN_SERVLET_CONTAINER && IS_JAKARTA && jakarta.servlet.http.HttpServletRequest.class.isAssignableFrom(request.getClass())) {
+                    final jakarta.servlet.http.HttpServletRequest httpServletRequest = (jakarta.servlet.http.HttpServletRequest) request;
+                    CarrierItem next = contextCarrier.items();
+                    while (next.hasNext()) {
+                        next = next.next();
+                        next.setHeadValue(httpServletRequest.getHeader(next.getHeadKey()));
+                    }
+
+                    String operationName =
+                        this.buildOperationName(method, httpServletRequest.getMethod(),
+                            (EnhanceRequireObjectCache) objInst.getSkyWalkingDynamicField());
+                    AbstractSpan span =
+                        ContextManager.createEntrySpan(operationName, contextCarrier);
+                    Tags.URL.set(span, httpServletRequest.getRequestURL().toString());
+                    Tags.HTTP.METHOD.set(span, httpServletRequest.getMethod());
+                    span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION);
+                    SpanLayer.asHttp(span);
+
+                    if (SpringMVCPluginConfig.Plugin.SpringMVC.COLLECT_HTTP_PARAMS) {
+                        RequestUtil.collectHttpParam(httpServletRequest, span);
+                    }
+
+                    if (!CollectionUtil
+                        .isEmpty(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS)) {
+                        RequestUtil.collectHttpHeaders(httpServletRequest, span);
+                    }
                 } else if (ServerHttpRequest.class.isAssignableFrom(request.getClass())) {
                     final ServerHttpRequest serverHttpRequest = (ServerHttpRequest) request;
                     CarrierItem next = contextCarrier.items();
@@ -191,8 +234,11 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
 
                     if (IS_SERVLET_GET_STATUS_METHOD_EXIST && HttpServletResponse.class.isAssignableFrom(response.getClass())) {
                         statusCode = ((HttpServletResponse) response).getStatus();
+                    } else if (IS_JAKARTA_SERVLET_GET_STATUS_METHOD_EXIST && jakarta.servlet.http.HttpServletResponse.class.isAssignableFrom(response.getClass())) {
+                        statusCode = ((jakarta.servlet.http.HttpServletResponse) response).getStatus();
+                        LOGGER.info("class: {}, span: {}, status: {}", response.getClass().getName(), span.getOperationName(), statusCode);
                     } else if (ServerHttpResponse.class.isAssignableFrom(response.getClass())) {
-                        if (IS_SERVLET_GET_STATUS_METHOD_EXIST) {
+                        if (IS_SERVLET_GET_STATUS_METHOD_EXIST || IS_JAKARTA_SERVLET_GET_STATUS_METHOD_EXIST) {
                             statusCode = ((ServerHttpResponse) response).getRawStatusCode();
                         }
                         Object context = runtimeContext.get(REACTIVE_ASYNC_SPAN_IN_RUNTIME_CONTEXT);
@@ -201,6 +247,7 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
                         }
                     }
 
+                    LOGGER.info("span: {}, status: {}", span.getOperationName(), statusCode);
                     if (statusCode != null) {
                         Tags.HTTP_RESPONSE_STATUS_CODE.set(span, statusCode);
                         if (statusCode >= 400) {
@@ -216,8 +263,10 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
 
                 // Active HTTP parameter collection automatically in the profiling context.
                 if (!SpringMVCPluginConfig.Plugin.SpringMVC.COLLECT_HTTP_PARAMS && span.isProfiling()) {
-                    if (HttpServletRequest.class.isAssignableFrom(request.getClass())) {
+                    if (IS_JAVAX && HttpServletRequest.class.isAssignableFrom(request.getClass())) {
                         RequestUtil.collectHttpParam((HttpServletRequest) request, span);
+                    } else if (IS_JAKARTA && jakarta.servlet.http.HttpServletRequest.class.isAssignableFrom(request.getClass())) {
+                        RequestUtil.collectHttpParam((jakarta.servlet.http.HttpServletRequest) request, span);
                     } else if (ServerHttpRequest.class.isAssignableFrom(request.getClass())) {
                         RequestUtil.collectHttpParam((ServerHttpRequest) request, span);
                     }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml
index 2e4f1349ed..b65560c99d 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml
@@ -31,6 +31,7 @@
         <module>async-annotation-plugin</module>
         <module>concurrent-util-4.x-plugin</module>
         <module>resttemplate-4.x-plugin</module>
+        <module>resttemplate-6.x-plugin</module>
         <module>mvc-annotation-4.x-plugin</module>
         <module>spring-cloud</module>
         <module>mvc-annotation-3.x-plugin</module>
@@ -38,6 +39,7 @@
         <module>mvc-annotation-commons</module>
         <module>spring-commons</module>
         <module>mvc-annotation-5.x-plugin</module>
+        <module>mvc-annotation-6.x-plugin</module>
         <module>spring-kafka-1.x-plugin</module>
         <module>spring-kafka-2.x-plugin</module>
         <module>scheduled-annotation-plugin</module>
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java
index 93631691a6..701ebfa9f7 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java
@@ -97,4 +97,11 @@ public class ResponseExtractorFutureInstrumentation extends ClassInstanceMethods
     protected ClassMatch enhanceClass() {
         return NameMatch.byName(ENHANCE_CLASS);
     }
+
+    @Override
+    protected String[] witnessClasses() {
+        return new String[] {
+            "org.springframework.web.client.AsyncRestTemplate"
+        };
+    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/RestTemplateInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/RestTemplateInstrumentation.java
index d0c8a32662..7ea2e9d956 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/RestTemplateInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/async/define/RestTemplateInstrumentation.java
@@ -94,4 +94,11 @@ public class RestTemplateInstrumentation extends ClassInstanceMethodsEnhancePlug
     protected ClassMatch enhanceClass() {
         return NameMatch.byName(ENHANCE_CLASS);
     }
+
+    @Override
+    protected String[] witnessClasses() {
+        return new String[] {
+            "org.springframework.web.client.AsyncRestTemplate"
+        };
+    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java
index 5f1e36b912..d6f09b17fa 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java
@@ -111,4 +111,11 @@ public class RestTemplateInstrumentation extends ClassInstanceMethodsEnhancePlug
     protected ClassMatch enhanceClass() {
         return byName(ENHANCE_CLASS);
     }
+
+    @Override
+    protected String[] witnessClasses() {
+        return new String[] {
+            "org.springframework.web.client.AsyncRestTemplate"
+        };
+    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/pom.xml
similarity index 59%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/pom.xml
index 70871bbe38..506324c7f1 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/pom.xml
@@ -24,42 +24,27 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>apm-springmvc-annotation-commons</artifactId>
+    <artifactId>apm-resttemplate-6.x-plugin</artifactId>
     <packaging>jar</packaging>
 
-    <name>mvc-annotation-commons</name>
-    <url>http://maven.apache.org</url>
+    <name>resttemplate-6.x-plugin</name>
 
     <properties>
-        <spring-core.version>4.3.10.RELEASE</spring-core.version>
-        <spring-webmvc.version>4.3.8.RELEASE</spring-webmvc.version>
-        <javax-servlet-api.version>3.0.1</javax-servlet-api.version>
+        <spring-web.version>6.0.0</spring-web.version>
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <version>${spring-core.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-webmvc</artifactId>
-            <version>${spring-webmvc.version}</version>
-            <scope>provided</scope>
-        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>
-            <version>5.2.4.RELEASE</version>
+            <version>${spring-web.version}</version>
             <scope>provided</scope>
         </dependency>
+
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>${javax-servlet-api.version}</version>
-            <scope>provided</scope>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>spring-commons</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/helper/RestTemplateRuntimeContextHelper.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/helper/RestTemplateRuntimeContextHelper.java
new file mode 100644
index 0000000000..bed866a0bc
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/helper/RestTemplateRuntimeContextHelper.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.helper;
+
+import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+
+public class RestTemplateRuntimeContextHelper {
+
+    private static final String REST_TEMPLATE_CONTEXT_CARRIER_KEY_IN_RUNTIME_CONTEXT = "REST_TEMPLATE_CONTEXT_CARRIER";
+
+    private static final String REST_TEMPLATE_URI_KEY_IN_RUNTIME_CONTEXT = "REST_TEMPLATE_URI";
+
+    public static void cleanUri() {
+        ContextManager.getRuntimeContext().remove(REST_TEMPLATE_URI_KEY_IN_RUNTIME_CONTEXT);
+    }
+
+    public static void cleanContextCarrier() {
+        ContextManager.getRuntimeContext().remove(REST_TEMPLATE_CONTEXT_CARRIER_KEY_IN_RUNTIME_CONTEXT);
+    }
+
+    public static void addUri(String uri) {
+        ContextManager.getRuntimeContext().put(REST_TEMPLATE_URI_KEY_IN_RUNTIME_CONTEXT, uri);
+    }
+
+    public static void addContextCarrier(ContextCarrier contextCarrier) {
+        ContextManager.getRuntimeContext().put(REST_TEMPLATE_CONTEXT_CARRIER_KEY_IN_RUNTIME_CONTEXT, contextCarrier);
+    }
+
+    public static String getUri() {
+        return (String) ContextManager.getRuntimeContext().get(REST_TEMPLATE_URI_KEY_IN_RUNTIME_CONTEXT);
+    }
+
+    public static ContextCarrier getContextCarrier() {
+        return (ContextCarrier) ContextManager.getRuntimeContext().get(REST_TEMPLATE_CONTEXT_CARRIER_KEY_IN_RUNTIME_CONTEXT);
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestExecuteInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestExecuteInterceptor.java
new file mode 100644
index 0000000000..7b9e7398e6
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestExecuteInterceptor.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync;
+
+import java.lang.reflect.Method;
+import java.net.URI;
+import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.helper.RestTemplateRuntimeContextHelper;
+import org.springframework.http.HttpMethod;
+
+public class RestExecuteInterceptor implements InstanceMethodsAroundInterceptor {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+        final URI requestURL = (URI) allArguments[0];
+        final HttpMethod httpMethod = (HttpMethod) allArguments[2];
+        final ContextCarrier contextCarrier = new ContextCarrier();
+
+        String remotePeer = requestURL.getHost() + ":" + (requestURL.getPort() > 0 ? requestURL.getPort() : "https".equalsIgnoreCase(requestURL
+            .getScheme()) ? 443 : 80);
+        String formatURIPath = requestURL.getPath();
+        AbstractSpan span = ContextManager.createExitSpan(formatURIPath, contextCarrier, remotePeer);
+
+        span.setComponent(ComponentsDefine.SPRING_REST_TEMPLATE);
+        Tags.URL.set(span, requestURL.getScheme() + "://" + requestURL.getHost() +
+                (requestURL.getPort() > 0 ? ":" + requestURL.getPort() : "") + requestURL.getPath());
+        Tags.HTTP.METHOD.set(span, httpMethod.toString());
+        SpanLayer.asHttp(span);
+
+        RestTemplateRuntimeContextHelper.addContextCarrier(contextCarrier);
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+        RestTemplateRuntimeContextHelper.cleanContextCarrier();
+        ContextManager.stopSpan();
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+        ContextManager.activeSpan().log(t);
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestRequestInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestRequestInterceptor.java
new file mode 100644
index 0000000000..455b897c58
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestRequestInterceptor.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.helper.RestTemplateRuntimeContextHelper;
+import org.springframework.http.client.AbstractClientHttpRequest;
+import org.springframework.http.client.ClientHttpRequest;
+
+public class RestRequestInterceptor implements InstanceMethodsAroundInterceptor {
+
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+        ClientHttpRequest clientHttpRequest = (ClientHttpRequest) ret;
+        if (clientHttpRequest instanceof AbstractClientHttpRequest) {
+            AbstractClientHttpRequest httpRequest = (AbstractClientHttpRequest) clientHttpRequest;
+            ContextCarrier contextCarrier = RestTemplateRuntimeContextHelper.getContextCarrier();
+            CarrierItem next = contextCarrier.items();
+            while (next.hasNext()) {
+                next = next.next();
+                httpRequest.getHeaders().set(next.getHeadKey(), next.getHeadValue());
+            }
+        }
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestResponseInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestResponseInterceptor.java
new file mode 100644
index 0000000000..3975562df4
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/RestResponseInterceptor.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.springframework.http.client.ClientHttpResponse;
+
+public class RestResponseInterceptor implements InstanceMethodsAroundInterceptor {
+
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+
+        ClientHttpResponse response = (ClientHttpResponse) allArguments[2];
+        int statusCode = response.getStatusCode().value();
+        AbstractSpan span = ContextManager.activeSpan();
+        Tags.HTTP_RESPONSE_STATUS_CODE.set(span, statusCode);
+        if (statusCode >= 400) {
+            span.errorOccurred();
+        }
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+        ContextManager.activeSpan().log(t);
+    }
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/define/RestTemplateInstrumentation.java
similarity index 89%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java
copy to apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/define/RestTemplateInstrumentation.java
index 5f1e36b912..c9fdb3823d 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/sync/define/RestTemplateInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/resttemplate/v6x/sync/define/RestTemplateInstrumentation.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.resttemplate.sync.define;
+package org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync.define;
 
 import net.bytebuddy.description.method.MethodDescription;
 import net.bytebuddy.matcher.ElementMatcher;
@@ -42,11 +42,11 @@ public class RestTemplateInstrumentation extends ClassInstanceMethodsEnhancePlug
 
     private static final String ENHANCE_CLASS = "org.springframework.web.client.RestTemplate";
     private static final String DO_EXECUTE_METHOD_NAME = "doExecute";
-    private static final String DO_EXECUTE_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.sync.RestExecuteInterceptor";
+    private static final String DO_EXECUTE_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync.RestExecuteInterceptor";
     private static final String HANDLE_REQUEST_METHOD_NAME = "handleResponse";
-    private static final String HAND_REQUEST_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.sync.RestResponseInterceptor";
+    private static final String HAND_REQUEST_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync.RestResponseInterceptor";
     private static final String CREATE_REQUEST_METHOD_NAME = "createRequest";
-    private static final String CREATE_REQUEST_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.sync.RestRequestInterceptor";
+    private static final String CREATE_REQUEST_INTERCEPTOR = "org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync.RestRequestInterceptor";
 
     @Override
     public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
@@ -111,4 +111,11 @@ public class RestTemplateInstrumentation extends ClassInstanceMethodsEnhancePlug
     protected ClassMatch enhanceClass() {
         return byName(ENHANCE_CLASS);
     }
+
+    @Override
+    protected String[] witnessClasses() {
+        return new String[] {
+            "org.springframework.web.client.ClientHttpResponseDecorator"
+        };
+    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/resources/skywalking-plugin.def
new file mode 100644
index 0000000000..2499f4bb29
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-6.x-plugin/src/main/resources/skywalking-plugin.def
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spring-resttemplate-6.x=org.apache.skywalking.apm.plugin.spring.resttemplate.v6x.sync.define.RestTemplateInstrumentation
diff --git a/docs/en/setup/service-agent/java-agent/Plugin-list.md b/docs/en/setup/service-agent/java-agent/Plugin-list.md
index 9d5ff07a43..71da7c3540 100644
--- a/docs/en/setup/service-agent/java-agent/Plugin-list.md
+++ b/docs/en/setup/service-agent/java-agent/Plugin-list.md
@@ -104,7 +104,9 @@
 - spring-mvc-annotation-3.x
 - spring-mvc-annotation-4.x
 - spring-mvc-annotation-5.x
+- spring-mvc-annotation-6.x
 - spring-resttemplate-4.x
+- spring-resttemplate-6.x
 - spring-scheduled-annotation
 - spring-tx
 - spring-webflux-5.x
diff --git a/test/plugin/containers/tomcat-container/src/main/docker/catalina.sh b/test/plugin/containers/tomcat-container/src/main/docker/catalina.sh
index 188d15eba9..416c41a8bb 100644
--- a/test/plugin/containers/tomcat-container/src/main/docker/catalina.sh
+++ b/test/plugin/containers/tomcat-container/src/main/docker/catalina.sh
@@ -119,7 +119,7 @@ if [ -f "${AGENT_FILE_PATH}/skywalking-agent.jar" ]; then
     -Dskywalking.agent.authentication=test-token
     -Dskywalking.meter.report_interval=1
     -Dskywalking.logging.dir=${LOGS_HOME}
-    -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxPermSize=64"
+    -Xms256m -Xmx256m"
 fi
 
 # OS specific support.  $var _must_ be set to either true or false.
diff --git a/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml b/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml
index e42f589827..a9ed427b2c 100644
--- a/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml
+++ b/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml
@@ -98,13 +98,20 @@
     <build>
         <finalName>spring-4.3.x-scenario</finalName>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.3.1</version>
+            </plugin>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>${maven-compiler-plugin.version}</version>
                 <configuration>
-                    <source>${compiler.version}</source>
+                    <source>
+                        ${compiler.version}</source>
                     <target>${compiler.version}</target>
-                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <encoding>
+                        ${project.build.sourceEncoding}</encoding>
                 </configuration>
             </plugin>
         </plugins>
diff --git a/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java b/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
index 84b80bd36c..6792ecb712 100644
--- a/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
+++ b/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
@@ -75,4 +75,3 @@ public class RestCaseController {
         return ResponseEntity.noContent().build();
     }
 }
-
diff --git a/test/plugin/scenarios/spring-6.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-6.x-scenario/config/expectedData.yaml
new file mode 100644
index 0000000000..15d6e7326f
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/config/expectedData.yaml
@@ -0,0 +1,375 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+segmentItems:
+- serviceName: spring-6.x-scenario
+  segmentSize: ge 10
+  segments:
+  - segmentId: not null
+    spans:
+    - operationName: HEAD:/healthCheck
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/healthCheck'}
+      - {key: http.method, value: HEAD}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: test.apache.skywalking.apm.testcase.spring3.component.TestComponentBean.componentMethod
+      parentSpanId: 1
+      spanId: 2
+      spanLayer: Unknown
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 93
+      isError: false
+      spanType: Local
+      peer: ''
+      skipAnalysis: 'false'
+    - operationName: test.apache.skywalking.apm.testcase.spring3.dao.TestRepositoryBean.doSomeStuff
+      parentSpanId: 1
+      spanId: 3
+      spanLayer: Unknown
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 93
+      isError: false
+      spanType: Local
+      peer: ''
+      skipAnalysis: 'false'
+    - operationName: test.apache.skywalking.apm.testcase.spring3.service.TestServiceBean.doSomeBusiness
+      parentSpanId: 0
+      spanId: 1
+      spanLayer: Unknown
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 93
+      isError: false
+      spanType: Local
+      peer: ''
+      skipAnalysis: 'false'
+    - operationName: GET:/case/spring3
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/case/spring3'}
+      - {key: http.method, value: GET}
+      - {key: http.headers, value: 'mock_header=[mock_value]'}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: 'POST:/create/'
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/create/'}
+      - {key: http.method, value: POST}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 2, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: 'GET:/get/{id}'
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/get/1'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 3, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: 'PUT:/update/{id}'
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/update/1'}
+      - {key: http.method, value: PUT}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 4, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: 'DELETE:/delete/{id}'
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/delete/1'}
+      - {key: http.method, value: DELETE}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint:  GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 5, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: GET:/inherit/child/test
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/inherit/child/test'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 6, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: GET:/impl/requestmapping
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/impl/requestmapping'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 7, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: 'GET:/impl/restmapping'
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/impl/restmapping'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      refs:
+      - {parentEndpoint: GET:/case/resttemplate, networkAddress: 'localhost:8080', refType: CrossProcess,
+        parentSpanId: 8, parentTraceSegmentId: not null, parentServiceInstance: not
+          null, parentService: spring-6.x-scenario, traceId: not null}
+      skipAnalysis: 'false'
+  - segmentId: not null
+    spans:
+    - operationName: /spring-6.x-scenario/case/spring3
+      parentSpanId: 0
+      spanId: 1
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 12
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: http.method, value: GET}
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/case/spring3'}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/create/
+      parentSpanId: 0
+      spanId: 2
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 13
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/create/'}
+      - {key: http.method, value: POST}
+      - {key: http.status_code, value: '201'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/get/1
+      parentSpanId: 0
+      spanId: 3
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 13
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/get/1'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/update/1
+      parentSpanId: 0
+      spanId: 4
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 13
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/update/1'}
+      - {key: http.method, value: PUT}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/delete/1
+      parentSpanId: 0
+      spanId: 5
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 13
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/delete/1'}
+      - {key: http.method, value: DELETE}
+      - {key: http.status_code, value: '204'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/inherit/child/test
+      parentSpanId: 0
+      spanId: 6
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 12
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: http.method, value: GET}
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/inherit/child/test'}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/impl/requestmapping
+      parentSpanId: 0
+      spanId: 7
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 12
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: http.method, value: GET}
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/impl/requestmapping'}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: /spring-6.x-scenario/impl/restmapping
+      parentSpanId: 0
+      spanId: 8
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 12
+      isError: false
+      spanType: Exit
+      peer: localhost:8080
+      tags:
+      - {key: http.method, value: GET}
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/impl/restmapping'}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
+    - operationName: GET:/case/resttemplate
+      parentSpanId: -1
+      spanId: 0
+      spanLayer: Http
+      startTime: nq 0
+      endTime: nq 0
+      componentId: 14
+      isError: false
+      spanType: Entry
+      peer: ''
+      tags:
+      - {key: url, value: 'http://localhost:8080/spring-6.x-scenario/case/resttemplate'}
+      - {key: http.method, value: GET}
+      - {key: http.status_code, value: '200'}
+      skipAnalysis: 'false'
diff --git a/test/plugin/scenarios/spring-6.x-scenario/configuration.yml b/test/plugin/scenarios/spring-6.x-scenario/configuration.yml
new file mode 100644
index 0000000000..dbe01d163c
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/configuration.yml
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+type: tomcat
+entryService: http://localhost:8080/spring-6.x-scenario/case/resttemplate
+healthCheck: http://localhost:8080/spring-6.x-scenario/healthCheck
+runningMode: with_optional
+withPlugins: apm-spring-annotation-plugin-*.jar
+environment:
+  - CATALINA_OPTS="-Dskywalking.plugin.http.include_http_headers=mock_header"
diff --git a/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml b/test/plugin/scenarios/spring-6.x-scenario/pom.xml
similarity index 87%
copy from test/plugin/scenarios/spring-4.3.x-scenario/pom.xml
copy to test/plugin/scenarios/spring-6.x-scenario/pom.xml
index e42f589827..4d8e38b736 100644
--- a/test/plugin/scenarios/spring-4.3.x-scenario/pom.xml
+++ b/test/plugin/scenarios/spring-6.x-scenario/pom.xml
@@ -22,7 +22,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>org.apache.skywalking</groupId>
-    <artifactId>spring-4.3.x-scenario</artifactId>
+    <artifactId>spring-6.x-scenario</artifactId>
     <version>5.0.0</version>
 
     <packaging>war</packaging>
@@ -31,19 +31,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <compiler.version>1.8</compiler.version>
         <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
-        <test.framework.version>4.3.0.RELEASE</test.framework.version>
+        <test.framework.version>6.0.0</test.framework.version>
         <test.framework>spring</test.framework>
     </properties>
 
-    <name>skywalking-spring-4.3.x-scenario</name>
+    <name>skywalking-spring-6.x-scenario</name>
 
     <dependencies>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.1.0</version>
-            <scope>provided</scope>
-        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
@@ -96,15 +90,22 @@
     </dependencies>
 
     <build>
-        <finalName>spring-4.3.x-scenario</finalName>
+        <finalName>spring-6.x-scenario</finalName>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.3.1</version>
+            </plugin>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>${maven-compiler-plugin.version}</version>
                 <configuration>
-                    <source>${compiler.version}</source>
+                    <source>
+                        ${compiler.version}</source>
                     <target>${compiler.version}</target>
-                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <encoding>
+                        ${project.build.sourceEncoding}</encoding>
                 </configuration>
             </plugin>
         </plugins>
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/entity/User.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/entity/User.java
index e17f47f810..e7fb1871e5 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/entity/User.java
@@ -16,18 +16,38 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.entity;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+public class User {
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+    private int id;
+    private String userName;
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    public User(int id) {
+        this.id = id;
+    }
+
+    public User(int id, String userName) {
+        this.id = id;
+        this.userName = userName;
+    }
+
+    public User() {
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseController.java
similarity index 59%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseController.java
index e17f47f810..7a95a9318a 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseController.java
@@ -16,18 +16,20 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.implinterface;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.web.bind.annotation.RestController;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@RestController
+public class TestCaseController implements TestCaseInterface {
 
     @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    public String implRequestMappingAnnotationTestCase() {
+        return "implRequestMappingAnnotationTestCase";
+    }
+
+    @Override
+    public String implRestAnnotationTestCase() {
+        return "implRestAnnotationTestCase";
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseInterface.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseInterface.java
index e17f47f810..4fea97b7b1 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/implinterface/TestCaseInterface.java
@@ -16,18 +16,16 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.implinterface;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@RequestMapping("/impl")
+public interface TestCaseInterface {
+    @RequestMapping(path = "/requestmapping")
+    String implRequestMappingAnnotationTestCase();
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
-    }
+    @GetMapping("/restmapping")
+    String implRestAnnotationTestCase();
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ChildController.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ChildController.java
index e17f47f810..27ddf54c76 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ChildController.java
@@ -16,18 +16,13 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.inherit;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@RestController
+@RequestMapping("/inherit/child")
+public class ChildController extends ParentController {
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
-    }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ParentController.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ParentController.java
index e17f47f810..16b928100d 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/inherit/ParentController.java
@@ -16,18 +16,17 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.inherit;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@RestController
+@RequestMapping("/inherit/parent")
+public class ParentController {
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    @RequestMapping("test")
+    public String test(Integer param) {
+        return "parent-a" + param;
     }
 }
diff --git a/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
similarity index 99%
copy from test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
index 84b80bd36c..6792ecb712 100644
--- a/test/plugin/scenarios/spring-4.3.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/restapi/RestCaseController.java
@@ -75,4 +75,3 @@ public class RestCaseController {
         return ResponseEntity.noContent().build();
     }
 }
-
diff --git a/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/resttemplate/RestTemplateController.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/resttemplate/RestTemplateController.java
new file mode 100644
index 0000000000..16b274f242
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/resttemplate/RestTemplateController.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package test.apache.skywalking.apm.testcase.resttemplate;
+
+import java.io.IOException;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.http.HttpEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+import test.apache.skywalking.apm.testcase.entity.User;
+
+@RestController
+public class RestTemplateController {
+
+    private static final String SUCCESS = "Success";
+
+    private static final Logger LOGGER = LogManager.getLogger(RestTemplateController.class);
+
+    private static final String URL = "http://localhost:8080/spring-6.x-scenario";
+
+    @RequestMapping("/case/resttemplate")
+    @ResponseBody
+    public String restTemplate() throws IOException {
+        Request request = new Request.Builder().header("mock_header", "mock_value").url(URL + "/case/spring3").build();
+        Response response = new OkHttpClient().newCall(request).execute();
+        LOGGER.info(response.toString());
+
+        // Create user
+        HttpEntity<User> userEntity = new HttpEntity<>(new User(1, "a"));
+        new RestTemplate().postForEntity(URL + "/create/", userEntity, Void.class);
+
+        // Find User
+        new RestTemplate().getForEntity(URL + "/get/{id}", User.class, 1);
+
+        //Modify user
+        HttpEntity<User> updateUserEntity = new HttpEntity<>(new User(1, "b"));
+        new RestTemplate().put(URL + "/update/{id}", updateUserEntity, userEntity.getBody().getId(), 1);
+
+        //Delete user
+        new RestTemplate().delete(URL + "/delete/{id}", 1);
+
+        Request inheritRequest = new Request.Builder().url(URL + "/inherit/child/test").build();
+        response = new OkHttpClient().newCall(inheritRequest).execute();
+        LOGGER.info(response.toString());
+
+        Request implRequestMappingRequest = new Request.Builder().url(URL + "/impl/requestmapping").build();
+        response = new OkHttpClient().newCall(implRequestMappingRequest).execute();
+        LOGGER.info(response.toString());
+
+        Request implRestMappingRequest = new Request.Builder().url(URL + "/impl/restmapping").build();
+        response = new OkHttpClient().newCall(implRestMappingRequest).execute();
+        LOGGER.info(response.toString());
+
+        return SUCCESS;
+    }
+
+    @RequestMapping("/healthCheck")
+    @ResponseBody
+    public String healthCheck() {
+        return SUCCESS;
+    }
+
+}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/CaseController.java
similarity index 54%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/CaseController.java
index 3ecf23eaa4..501c691579 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v3/define/AbstractSpring3Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/CaseController.java
@@ -16,20 +16,26 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v3.define;
+package test.apache.skywalking.apm.testcase.spring3;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import test.apache.skywalking.apm.testcase.spring3.service.TestServiceBean;
 
-/**
- * {@link AbstractSpring3Instrumentation} define witness classes of the spring mvc 3 plugin. all Instrumentations
- * extends this class.
- */
-public abstract class AbstractSpring3Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
+@Controller
+public class CaseController {
+
+    private static final String SUCCESS = "Success";
 
-    public static final String WITHNESS_CLASSES = "org.springframework.web.servlet.view.xslt.AbstractXsltView";
+    @Autowired
+    private TestServiceBean testServiceBean;
 
-    @Override
-    protected final String[] witnessClasses() {
-        return new String[] {WITHNESS_CLASSES};
+    @RequestMapping(value = "/case/spring3")
+    @ResponseBody
+    public String updateUser() {
+        testServiceBean.doSomeBusiness("test");
+        return SUCCESS;
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/component/TestComponentBean.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/component/TestComponentBean.java
index e17f47f810..274aaf490e 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/component/TestComponentBean.java
@@ -16,18 +16,14 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.spring3.component;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.stereotype.Component;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@Component
+public class TestComponentBean {
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    public String componentMethod(String name) {
+        return name + "-" + "dealWith-component";
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/dao/TestRepositoryBean.java
similarity index 58%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/dao/TestRepositoryBean.java
index e17f47f810..84f871ef55 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/dao/TestRepositoryBean.java
@@ -16,18 +16,14 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.spring3.dao;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.stereotype.Repository;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@Repository
+public class TestRepositoryBean {
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    public String doSomeStuff(String name) {
+        return name + "-dealWithRepository";
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/service/TestServiceBean.java
similarity index 56%
copy from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
copy to test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/service/TestServiceBean.java
index e17f47f810..811fe11648 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/spring3/service/TestServiceBean.java
@@ -16,18 +16,23 @@
  *
  */
 
-package org.apache.skywalking.apm.plugin.spring.mvc.v4.define;
+package test.apache.skywalking.apm.testcase.spring3.service;
 
-import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import test.apache.skywalking.apm.testcase.spring3.dao.TestRepositoryBean;
+import test.apache.skywalking.apm.testcase.spring3.component.TestComponentBean;
 
-public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine {
-    public static final String WITHNESS_CLASSES = "org.springframework.cache.interceptor.SimpleKey";
+@Service
+public class TestServiceBean {
+    @Autowired
+    private TestComponentBean componentBean;
 
-    @Override
-    protected String[] witnessClasses() {
-        return new String[] {
-            WITHNESS_CLASSES,
-            "org.springframework.cache.interceptor.DefaultKeyGenerator"
-        };
+    @Autowired
+    private TestRepositoryBean repositoryBean;
+
+    public void doSomeBusiness(String name) {
+        componentBean.componentMethod(name);
+        repositoryBean.doSomeStuff(name);
     }
 }
diff --git a/test/plugin/scenarios/spring-6.x-scenario/src/main/resources/log4j2.xml b/test/plugin/scenarios/spring-6.x-scenario/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..b5cda5ae8a
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/resources/log4j2.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_ERR">
+            <PatternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="WARN">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/spring-mvc-servlet.xml b/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/spring-mvc-servlet.xml
new file mode 100644
index 0000000000..b8a2885d3e
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/spring-mvc-servlet.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                           http://www.springframework.org/schema/context
+                           http://www.springframework.org/schema/context/spring-context-3.0.xsd
+                           http://www.springframework.org/schema/mvc
+                           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
+    <context:component-scan base-package="test.apache.skywalking.apm.testcase"/>
+    <mvc:annotation-driven/>
+</beans>
\ No newline at end of file
diff --git a/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/web.xml b/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..fb573c21fc
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,35 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+		 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+    <display-name>skywalking-spring-3.1.x-scenario</display-name>
+
+    <servlet>
+        <servlet-name>spring-mvc</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>spring-mvc</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+</web-app>
diff --git a/test/plugin/scenarios/spring-6.x-scenario/support-version.list b/test/plugin/scenarios/spring-6.x-scenario/support-version.list
new file mode 100644
index 0000000000..3c4d8d425d
--- /dev/null
+++ b/test/plugin/scenarios/spring-6.x-scenario/support-version.list
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+6.0.4