You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2022/12/16 11:26:57 UTC

[shardingsphere] branch master updated: Add MethodAdvisorBuilder (#22914)

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

sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 2930bb2cddf Add MethodAdvisorBuilder (#22914)
2930bb2cddf is described below

commit 2930bb2cddf71f406b454850f5583500e6edc56a
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Dec 16 19:26:50 2022 +0800

    Add MethodAdvisorBuilder (#22914)
    
    * Refactor AdvisorBuilder
    
    * Add MethodAdvisorBuilder
    
    * For checkstyle
    
    * Refactor package of transformer.build
---
 .../agent/core/transformer/AgentTransformer.java   |  18 ++-
 .../build/MethodAdvisorBuildEngine.java            |  79 +++++++++++++
 .../{builder => build}/advise/AdviceFactory.java   |   2 +-
 .../advise/JDBCAdviceFactory.java                  |   2 +-
 .../advise/ProxyAdviceFactory.java                 |   2 +-
 .../build/builder/MethodAdvisorBuilder.java        |  68 +++++++++++
 .../builder/type/ConstructorAdvisorBuilder.java    |  72 ++++++++++++
 .../type}/InstanceMethodAdvisorBuilder.java        |  74 ++++--------
 .../builder/type/StaticMethodAdvisorBuilder.java   |  90 +++++++++++++++
 .../builder/ConstructorAdvisorBuilder.java         | 105 -----------------
 .../builder/StaticMethodAdvisorBuilder.java        | 124 ---------------------
 11 files changed, 340 insertions(+), 296 deletions(-)

diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
index 24d3eb4da0e..102fe449874 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
@@ -26,11 +26,11 @@ import net.bytebuddy.jar.asm.Opcodes;
 import net.bytebuddy.utility.JavaModule;
 import org.apache.shardingsphere.agent.config.advisor.AdvisorConfiguration;
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
-import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
 import org.apache.shardingsphere.agent.core.plugin.TargetAdviceObject;
-import org.apache.shardingsphere.agent.core.transformer.builder.ConstructorAdvisorBuilder;
-import org.apache.shardingsphere.agent.core.transformer.builder.InstanceMethodAdvisorBuilder;
-import org.apache.shardingsphere.agent.core.transformer.builder.StaticMethodAdvisorBuilder;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.type.ConstructorAdvisorBuilder;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.type.InstanceMethodAdvisorBuilder;
+import org.apache.shardingsphere.agent.core.transformer.build.MethodAdvisorBuildEngine;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.type.StaticMethodAdvisorBuilder;
 
 import java.util.Map;
 
@@ -40,15 +40,13 @@ import java.util.Map;
 @RequiredArgsConstructor
 public final class AgentTransformer implements Transformer {
     
-    private static final LoggerFactory.Logger LOGGER = LoggerFactory.getLogger(AgentTransformer.class);
-    
     private static final String EXTRA_DATA = "_$EXTRA_DATA$_";
     
     private final Map<String, PluginConfiguration> pluginConfigs;
     
     private final Map<String, AdvisorConfiguration> advisorConfigs;
     
-    private final boolean isEnhancedForProxy;
+    private final boolean enhanceProxy;
     
     @SuppressWarnings("NullableProblems")
     @Override
@@ -58,9 +56,9 @@ public final class AgentTransformer implements Transformer {
         }
         Builder<?> result = builder.defineField(EXTRA_DATA, Object.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA));
         AdvisorConfiguration advisorConfig = advisorConfigs.get(typeDescription.getTypeName());
-        result = new ConstructorAdvisorBuilder(pluginConfigs, advisorConfig.getConstructorAdvisors(), isEnhancedForProxy, typeDescription, classLoader).create(result);
-        result = new InstanceMethodAdvisorBuilder(pluginConfigs, advisorConfig.getInstanceMethodAdvisors(), isEnhancedForProxy, typeDescription, classLoader).create(result);
-        result = new StaticMethodAdvisorBuilder(pluginConfigs, advisorConfig.getStaticMethodAdvisors(), isEnhancedForProxy, typeDescription, classLoader).create(result);
+        result = new MethodAdvisorBuildEngine<>(advisorConfig.getConstructorAdvisors(), typeDescription).create(result, new ConstructorAdvisorBuilder(pluginConfigs, enhanceProxy, classLoader));
+        result = new MethodAdvisorBuildEngine<>(advisorConfig.getInstanceMethodAdvisors(), typeDescription).create(result, new InstanceMethodAdvisorBuilder(pluginConfigs, enhanceProxy, classLoader));
+        result = new MethodAdvisorBuildEngine<>(advisorConfig.getStaticMethodAdvisors(), typeDescription).create(result, new StaticMethodAdvisorBuilder(pluginConfigs, enhanceProxy, classLoader));
         return result;
     }
 }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/MethodAdvisorBuildEngine.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/MethodAdvisorBuildEngine.java
new file mode 100644
index 00000000000..563ca9b7e4c
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/MethodAdvisorBuildEngine.java
@@ -0,0 +1,79 @@
+/*
+ * 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.shardingsphere.agent.core.transformer.build;
+
+import lombok.RequiredArgsConstructor;
+import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
+import net.bytebuddy.description.type.TypeDescription;
+import net.bytebuddy.dynamic.DynamicType.Builder;
+import org.apache.shardingsphere.agent.config.advisor.method.MethodAdvisorConfiguration;
+import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
+import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.MethodAdvisorBuilder;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Method advisor build engine.
+ */
+@RequiredArgsConstructor
+public final class MethodAdvisorBuildEngine<T extends MethodAdvisorConfiguration> {
+    
+    private static final LoggerFactory.Logger LOGGER = LoggerFactory.getLogger(MethodAdvisorBuildEngine.class);
+    
+    private final Collection<T> advisorConfigs;
+    
+    private final TypeDescription typePointcut;
+    
+    /**
+     * Create method advisor builder.
+     * 
+     * @param builder original builder
+     * @param methodAdvisorBuilder method advisor builder
+     * @return created builder
+     */
+    public Builder<?> create(final Builder<?> builder, final MethodAdvisorBuilder<T> methodAdvisorBuilder) {
+        Builder<?> result = builder;
+        Collection<MethodAdvisor> matchedAdvisor = typePointcut.getDeclaredMethods().stream()
+                .filter(methodAdvisorBuilder::isMatchedMethod).map(each -> findMatchedAdvisor(each, methodAdvisorBuilder)).filter(Objects::nonNull).collect(Collectors.toList());
+        for (MethodAdvisor each : matchedAdvisor) {
+            try {
+                result = methodAdvisorBuilder.create(result, each);
+                // CHECKSTYLE:OFF
+            } catch (final Throwable ex) {
+                // CHECKSTYLE:ON
+                LOGGER.error("Failed to load advice class: {}.", typePointcut.getTypeName(), ex);
+            }
+        }
+        return result;
+    }
+    
+    private MethodAdvisor findMatchedAdvisor(final InDefinedShape methodDescription, final MethodAdvisorBuilder<T> methodAdvisorBuilder) {
+        List<T> matchedAdvisorConfigs = advisorConfigs.stream().filter(each -> each.getPointcut().matches(methodDescription)).collect(Collectors.toList());
+        if (matchedAdvisorConfigs.isEmpty()) {
+            return null;
+        }
+        if (1 == matchedAdvisorConfigs.size()) {
+            return methodAdvisorBuilder.getSingleMethodAdvisor(methodDescription, matchedAdvisorConfigs.get(0));
+        }
+        return methodAdvisorBuilder.getComposedMethodAdvisor(methodDescription, matchedAdvisorConfigs);
+    }
+}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
similarity index 96%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
index f43e1205122..72a2f0ae6cc 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.transformer.builder.advise;
+package org.apache.shardingsphere.agent.core.transformer.build.advise;
 
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
 
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
similarity index 97%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
index dc5cc55b540..ed7fba49705 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.transformer.builder.advise;
+package org.apache.shardingsphere.agent.core.transformer.build.advise;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/ProxyAdviceFactory.java
similarity index 96%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/ProxyAdviceFactory.java
index 737398454f6..f83a55fdb4e 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/ProxyAdviceFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.transformer.builder.advise;
+package org.apache.shardingsphere.agent.core.transformer.build.advise;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/MethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/MethodAdvisorBuilder.java
new file mode 100644
index 00000000000..068aba47177
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/MethodAdvisorBuilder.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.shardingsphere.agent.core.transformer.build.builder;
+
+import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
+import net.bytebuddy.dynamic.DynamicType.Builder;
+import org.apache.shardingsphere.agent.config.advisor.method.MethodAdvisorConfiguration;
+import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+
+import java.util.List;
+
+/**
+ * Method advisor builder.
+ * 
+ * @param <T> type of method advisor configuration
+ */
+public interface MethodAdvisorBuilder<T extends MethodAdvisorConfiguration> {
+    
+    /**
+     * Create method advisor builder.
+     * 
+     * @param builder original builder
+     * @param methodAdvisor method advisor
+     * @return created builder
+     */
+    Builder<?> create(Builder<?> builder, MethodAdvisor methodAdvisor);
+    
+    /**
+     * Judge whether method matched.
+     * 
+     * @param methodDescription method description
+     * @return matched or not
+     */
+    boolean isMatchedMethod(InDefinedShape methodDescription);
+    
+    /**
+     * Get single method advisor.
+     * 
+     * @param methodDescription method description
+     * @param advisorConfig advisor configuration
+     * @return got method advisor
+     */
+    MethodAdvisor getSingleMethodAdvisor(InDefinedShape methodDescription, T advisorConfig);
+    
+    /**
+     * Get composed method advisor.
+     * 
+     * @param methodDescription method description
+     * @param advisorConfigs advisor configurations
+     * @return got method advisor
+     */
+    MethodAdvisor getComposedMethodAdvisor(InDefinedShape methodDescription, List<T> advisorConfigs);
+}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/ConstructorAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/ConstructorAdvisorBuilder.java
new file mode 100644
index 00000000000..5049a7e0581
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/ConstructorAdvisorBuilder.java
@@ -0,0 +1,72 @@
+/*
+ * 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.shardingsphere.agent.core.transformer.build.builder.type;
+
+import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
+import net.bytebuddy.dynamic.DynamicType.Builder;
+import net.bytebuddy.implementation.MethodDelegation;
+import net.bytebuddy.implementation.SuperMethodCall;
+import net.bytebuddy.matcher.ElementMatchers;
+import org.apache.shardingsphere.agent.config.advisor.method.type.ConstructorAdvisorConfiguration;
+import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
+import org.apache.shardingsphere.agent.core.plugin.advice.ConstructorAdvice;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.ConstructorInterceptor;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedConstructorInterceptor;
+import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.build.advise.AdviceFactory;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.MethodAdvisorBuilder;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Constructor advisor builder.
+ */
+public final class ConstructorAdvisorBuilder implements MethodAdvisorBuilder<ConstructorAdvisorConfiguration> {
+    
+    private final AdviceFactory adviceFactory;
+    
+    public ConstructorAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final boolean isEnhancedForProxy, final ClassLoader classLoader) {
+        adviceFactory = new AdviceFactory(classLoader, pluginConfigs, isEnhancedForProxy);
+    }
+    
+    @Override
+    public Builder<?> create(final Builder<?> builder, final MethodAdvisor methodAdvisor) {
+        return builder.constructor(ElementMatchers.is(methodAdvisor.getPointcut()))
+                .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(methodAdvisor.getAdvice())));
+    }
+    
+    @Override
+    public boolean isMatchedMethod(final InDefinedShape methodDescription) {
+        return methodDescription.isConstructor();
+    }
+    
+    @Override
+    public MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodDescription, final ConstructorAdvisorConfiguration advisorConfig) {
+        return new MethodAdvisor(methodDescription, new ConstructorInterceptor(adviceFactory.getAdvice(advisorConfig.getAdviceClassName())));
+    }
+    
+    @Override
+    public MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodDescription, final List<ConstructorAdvisorConfiguration> advisorConfigs) {
+        Collection<ConstructorAdvice> advices = advisorConfigs
+                .stream().map(ConstructorAdvisorConfiguration::getAdviceClassName).map(each -> (ConstructorAdvice) adviceFactory.getAdvice(each)).collect(Collectors.toList());
+        return new MethodAdvisor(methodDescription, new ComposedConstructorInterceptor(advices));
+    }
+}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/InstanceMethodAdvisorBuilder.java
similarity index 50%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/InstanceMethodAdvisorBuilder.java
index c428c6c4c57..fd5bcbb07fb 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/InstanceMethodAdvisorBuilder.java
@@ -15,17 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.transformer.builder;
+package org.apache.shardingsphere.agent.core.transformer.build.builder.type;
 
 import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
-import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.dynamic.DynamicType.Builder;
 import net.bytebuddy.implementation.MethodDelegation;
 import net.bytebuddy.implementation.bind.annotation.Morph;
 import net.bytebuddy.matcher.ElementMatchers;
 import org.apache.shardingsphere.agent.config.advisor.method.type.InstanceMethodAdvisorConfiguration;
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
-import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
 import org.apache.shardingsphere.agent.core.plugin.OverrideArgsInvoker;
 import org.apache.shardingsphere.agent.core.plugin.advice.InstanceMethodAroundAdvice;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.InstanceMethodAroundInterceptor;
@@ -33,80 +31,48 @@ import org.apache.shardingsphere.agent.core.plugin.interceptor.InstanceMethodInt
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedInstanceMethodAroundInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedInstanceMethodInterceptorArgsOverride;
 import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
-import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
+import org.apache.shardingsphere.agent.core.transformer.build.advise.AdviceFactory;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.MethodAdvisorBuilder;
 
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 
 /**
  * Instance method advisor builder.
  */
-public final class InstanceMethodAdvisorBuilder {
-    
-    private static final LoggerFactory.Logger LOGGER = LoggerFactory.getLogger(InstanceMethodAdvisorBuilder.class);
-    
-    private final Collection<InstanceMethodAdvisorConfiguration> advisorConfigs;
-    
-    private final TypeDescription typePointcut;
+public final class InstanceMethodAdvisorBuilder implements MethodAdvisorBuilder<InstanceMethodAdvisorConfiguration> {
     
     private final AdviceFactory adviceFactory;
     
-    public InstanceMethodAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final Collection<InstanceMethodAdvisorConfiguration> advisorConfigs,
-                                        final boolean isEnhancedForProxy, final TypeDescription typePointcut, final ClassLoader classLoader) {
-        this.advisorConfigs = advisorConfigs;
-        this.typePointcut = typePointcut;
+    public InstanceMethodAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final boolean isEnhancedForProxy, final ClassLoader classLoader) {
         adviceFactory = new AdviceFactory(classLoader, pluginConfigs, isEnhancedForProxy);
     }
     
-    /**
-     * Create instance method advisor builder.
-     * 
-     * @param builder original builder
-     * @return created builder
-     */
-    public Builder<?> create(final Builder<?> builder) {
-        Builder<?> result = builder;
-        Collection<MethodAdvisor> matchedAdvisors = typePointcut.getDeclaredMethods()
-                .stream().filter(each -> !(each.isAbstract() || each.isSynthetic())).map(this::getMatchedAdvisor).filter(Objects::nonNull).collect(Collectors.toList());
-        for (MethodAdvisor each : matchedAdvisors) {
-            try {
-                if (each.getAdvice() instanceof InstanceMethodInterceptorArgsOverride) {
-                    result = result.method(ElementMatchers.is(each.getPointcut()))
-                            .intercept(MethodDelegation.withDefaultConfiguration().withBinders(Morph.Binder.install(OverrideArgsInvoker.class)).to(each.getAdvice()));
-                } else {
-                    result = result.method(ElementMatchers.is(each.getPointcut())).intercept(MethodDelegation.withDefaultConfiguration().to(each.getAdvice()));
-                }
-                // CHECKSTYLE:OFF
-            } catch (final Throwable ex) {
-                // CHECKSTYLE:ON
-                LOGGER.error("Failed to load advice class: {}.", typePointcut.getTypeName(), ex);
-            }
+    @Override
+    public Builder<?> create(final Builder<?> builder, final MethodAdvisor methodAdvisor) {
+        if (methodAdvisor.getAdvice() instanceof InstanceMethodInterceptorArgsOverride) {
+            return builder.method(ElementMatchers.is(methodAdvisor.getPointcut()))
+                    .intercept(MethodDelegation.withDefaultConfiguration().withBinders(Morph.Binder.install(OverrideArgsInvoker.class)).to(methodAdvisor.getAdvice()));
         }
-        return result;
+        return builder.method(ElementMatchers.is(methodAdvisor.getPointcut())).intercept(MethodDelegation.withDefaultConfiguration().to(methodAdvisor.getAdvice()));
     }
     
-    private MethodAdvisor getMatchedAdvisor(final InDefinedShape methodPointcut) {
-        List<InstanceMethodAdvisorConfiguration> matchedAdvisorConfigs = advisorConfigs.stream().filter(each -> each.getPointcut().matches(methodPointcut)).collect(Collectors.toList());
-        if (matchedAdvisorConfigs.isEmpty()) {
-            return null;
-        }
-        if (1 == matchedAdvisorConfigs.size()) {
-            return getSingleMethodAdvisor(methodPointcut, matchedAdvisorConfigs.get(0));
-        }
-        return getComposedMethodAdvisor(methodPointcut);
+    @Override
+    public boolean isMatchedMethod(final InDefinedShape methodDescription) {
+        return !(methodDescription.isAbstract() || methodDescription.isSynthetic());
     }
     
-    private MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodPointcut, final InstanceMethodAdvisorConfiguration advisorConfig) {
+    @Override
+    public MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodDescription, final InstanceMethodAdvisorConfiguration advisorConfig) {
         InstanceMethodAroundAdvice instanceMethodAroundAdvice = adviceFactory.getAdvice(advisorConfig.getAdviceClassName());
         Object advice = advisorConfig.isOverrideArgs() ? new InstanceMethodInterceptorArgsOverride(instanceMethodAroundAdvice) : new InstanceMethodAroundInterceptor(instanceMethodAroundAdvice);
-        return new MethodAdvisor(methodPointcut, advice);
+        return new MethodAdvisor(methodDescription, advice);
     }
     
-    private MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodPointcut) {
+    @Override
+    public MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodDescription, final List<InstanceMethodAdvisorConfiguration> advisorConfigs) {
         Collection<InstanceMethodAroundAdvice> instanceMethodAroundAdvices = new LinkedList<>();
         boolean isArgsOverride = false;
         for (InstanceMethodAdvisorConfiguration each : advisorConfigs) {
@@ -118,6 +84,6 @@ public final class InstanceMethodAdvisorBuilder {
             }
         }
         Object advice = isArgsOverride ? new ComposedInstanceMethodInterceptorArgsOverride(instanceMethodAroundAdvices) : new ComposedInstanceMethodAroundInterceptor(instanceMethodAroundAdvices);
-        return new MethodAdvisor(methodPointcut, advice);
+        return new MethodAdvisor(methodDescription, advice);
     }
 }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/StaticMethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/StaticMethodAdvisorBuilder.java
new file mode 100644
index 00000000000..807f09dd952
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/builder/type/StaticMethodAdvisorBuilder.java
@@ -0,0 +1,90 @@
+/*
+ * 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.shardingsphere.agent.core.transformer.build.builder.type;
+
+import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
+import net.bytebuddy.dynamic.DynamicType.Builder;
+import net.bytebuddy.implementation.MethodDelegation;
+import net.bytebuddy.implementation.bind.annotation.Morph;
+import net.bytebuddy.matcher.ElementMatchers;
+import org.apache.shardingsphere.agent.config.advisor.method.type.StaticMethodAdvisorConfiguration;
+import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
+import org.apache.shardingsphere.agent.core.plugin.OverrideArgsInvoker;
+import org.apache.shardingsphere.agent.core.plugin.advice.StaticMethodAroundAdvice;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.StaticMethodAroundInterceptor;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.StaticMethodInterceptorArgsOverride;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodAroundInterceptor;
+import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodInterceptorArgsOverride;
+import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.build.advise.AdviceFactory;
+import org.apache.shardingsphere.agent.core.transformer.build.builder.MethodAdvisorBuilder;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Static method advisor builder.
+ */
+public final class StaticMethodAdvisorBuilder implements MethodAdvisorBuilder<StaticMethodAdvisorConfiguration> {
+    
+    private final AdviceFactory adviceFactory;
+    
+    public StaticMethodAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final boolean isEnhancedForProxy, final ClassLoader classLoader) {
+        adviceFactory = new AdviceFactory(classLoader, pluginConfigs, isEnhancedForProxy);
+    }
+    
+    @Override
+    public Builder<?> create(final Builder<?> builder, final MethodAdvisor methodAdvisor) {
+        if (methodAdvisor.getAdvice() instanceof StaticMethodInterceptorArgsOverride) {
+            return builder.method(ElementMatchers.is(methodAdvisor.getPointcut()))
+                    .intercept(MethodDelegation.withDefaultConfiguration().withBinders(Morph.Binder.install(OverrideArgsInvoker.class)).to(methodAdvisor.getAdvice()));
+        }
+        return builder.method(ElementMatchers.is(methodAdvisor.getPointcut())).intercept(MethodDelegation.withDefaultConfiguration().to(methodAdvisor.getAdvice()));
+    }
+    
+    @Override
+    public boolean isMatchedMethod(final InDefinedShape methodDescription) {
+        return methodDescription.isStatic() && !(methodDescription.isAbstract() || methodDescription.isSynthetic());
+    }
+    
+    @Override
+    public MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodDescription, final StaticMethodAdvisorConfiguration advisorConfig) {
+        StaticMethodAroundAdvice staticMethodAroundAdvice = adviceFactory.getAdvice(advisorConfig.getAdviceClassName());
+        return advisorConfig.isOverrideArgs()
+                ? new MethodAdvisor(methodDescription, new StaticMethodInterceptorArgsOverride(staticMethodAroundAdvice))
+                : new MethodAdvisor(methodDescription, new StaticMethodAroundInterceptor(staticMethodAroundAdvice));
+    }
+    
+    @Override
+    public MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodDescription, final List<StaticMethodAdvisorConfiguration> advisorConfigs) {
+        Collection<StaticMethodAroundAdvice> staticMethodAroundAdvices = new LinkedList<>();
+        boolean isArgsOverride = false;
+        for (StaticMethodAdvisorConfiguration each : advisorConfigs) {
+            if (each.isOverrideArgs()) {
+                isArgsOverride = true;
+            }
+            if (null != each.getAdviceClassName()) {
+                staticMethodAroundAdvices.add(adviceFactory.getAdvice(each.getAdviceClassName()));
+            }
+        }
+        Object advice = isArgsOverride ? new ComposedStaticMethodInterceptorArgsOverride(staticMethodAroundAdvices) : new ComposedStaticMethodAroundInterceptor(staticMethodAroundAdvices);
+        return new MethodAdvisor(methodDescription, advice);
+    }
+}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java
deleted file mode 100644
index 4e4516adacf..00000000000
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.shardingsphere.agent.core.transformer.builder;
-
-import net.bytebuddy.description.method.MethodDescription;
-import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
-import net.bytebuddy.description.type.TypeDescription;
-import net.bytebuddy.dynamic.DynamicType.Builder;
-import net.bytebuddy.implementation.MethodDelegation;
-import net.bytebuddy.implementation.SuperMethodCall;
-import net.bytebuddy.matcher.ElementMatchers;
-import org.apache.shardingsphere.agent.config.advisor.method.type.ConstructorAdvisorConfiguration;
-import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
-import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
-import org.apache.shardingsphere.agent.core.plugin.advice.ConstructorAdvice;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.ConstructorInterceptor;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedConstructorInterceptor;
-import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
-import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * Constructor advisor builder.
- */
-public final class ConstructorAdvisorBuilder {
-    
-    private static final LoggerFactory.Logger LOGGER = LoggerFactory.getLogger(ConstructorAdvisorBuilder.class);
-    
-    private final Collection<ConstructorAdvisorConfiguration> advisorConfigs;
-    
-    private final TypeDescription typePointcut;
-    
-    private final AdviceFactory adviceFactory;
-    
-    public ConstructorAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final Collection<ConstructorAdvisorConfiguration> advisorConfigs,
-                                     final boolean isEnhancedForProxy, final TypeDescription typePointcut, final ClassLoader classLoader) {
-        this.advisorConfigs = advisorConfigs;
-        this.typePointcut = typePointcut;
-        adviceFactory = new AdviceFactory(classLoader, pluginConfigs, isEnhancedForProxy);
-    }
-    
-    /**
-     * Create constructor advisor builder.
-     * 
-     * @param builder original builder
-     * @return created builder
-     */
-    public Builder<?> create(final Builder<?> builder) {
-        Builder<?> result = builder;
-        Collection<MethodAdvisor> matchedAdvisor = typePointcut.getDeclaredMethods()
-                .stream().filter(MethodDescription::isConstructor).map(this::getMatchedAdvisor).filter(Objects::nonNull).collect(Collectors.toList());
-        for (MethodAdvisor each : matchedAdvisor) {
-            try {
-                result = result.constructor(ElementMatchers.is(each.getPointcut()))
-                        .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(each.getAdvice())));
-                // CHECKSTYLE:OFF
-            } catch (final Throwable ex) {
-                // CHECKSTYLE:ON
-                LOGGER.error("Failed to load advice class: {}.", typePointcut.getTypeName(), ex);
-            }
-        }
-        return result;
-    }
-    
-    private MethodAdvisor getMatchedAdvisor(final InDefinedShape methodPointcut) {
-        List<ConstructorAdvisorConfiguration> matchedAdvisorConfigs = advisorConfigs.stream().filter(each -> each.getPointcut().matches(methodPointcut)).collect(Collectors.toList());
-        if (matchedAdvisorConfigs.isEmpty()) {
-            return null;
-        }
-        if (1 == matchedAdvisorConfigs.size()) {
-            return getSingleMethodAdvisor(methodPointcut, matchedAdvisorConfigs);
-        }
-        return getComposedMethodAdvisor(methodPointcut, matchedAdvisorConfigs);
-    }
-    
-    private MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodPointcut, final List<ConstructorAdvisorConfiguration> matchedAdvisorConfigs) {
-        return new MethodAdvisor(methodPointcut, new ConstructorInterceptor(adviceFactory.getAdvice(matchedAdvisorConfigs.get(0).getAdviceClassName())));
-    }
-    
-    private MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodPointcut, final List<ConstructorAdvisorConfiguration> matchedAdvisorConfigs) {
-        Collection<ConstructorAdvice> advices = matchedAdvisorConfigs
-                .stream().map(ConstructorAdvisorConfiguration::getAdviceClassName).map(each -> (ConstructorAdvice) adviceFactory.getAdvice(each)).collect(Collectors.toList());
-        return new MethodAdvisor(methodPointcut, new ComposedConstructorInterceptor(advices));
-    }
-}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java
deleted file mode 100644
index 78aa28ff750..00000000000
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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.shardingsphere.agent.core.transformer.builder;
-
-import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
-import net.bytebuddy.description.type.TypeDescription;
-import net.bytebuddy.dynamic.DynamicType.Builder;
-import net.bytebuddy.implementation.MethodDelegation;
-import net.bytebuddy.implementation.bind.annotation.Morph;
-import net.bytebuddy.matcher.ElementMatchers;
-import org.apache.shardingsphere.agent.config.advisor.method.type.StaticMethodAdvisorConfiguration;
-import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
-import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
-import org.apache.shardingsphere.agent.core.plugin.OverrideArgsInvoker;
-import org.apache.shardingsphere.agent.core.plugin.advice.StaticMethodAroundAdvice;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.StaticMethodAroundInterceptor;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.StaticMethodInterceptorArgsOverride;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodAroundInterceptor;
-import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodInterceptorArgsOverride;
-import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
-import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * Static method advisor builder.
- */
-public final class StaticMethodAdvisorBuilder {
-    
-    private static final LoggerFactory.Logger LOGGER = LoggerFactory.getLogger(StaticMethodAdvisorBuilder.class);
-    
-    private final Collection<StaticMethodAdvisorConfiguration> advisorConfigs;
-    
-    private final TypeDescription typePointcut;
-    
-    private final AdviceFactory adviceFactory;
-    
-    public StaticMethodAdvisorBuilder(final Map<String, PluginConfiguration> pluginConfigs, final Collection<StaticMethodAdvisorConfiguration> advisorConfigs,
-                                      final boolean isEnhancedForProxy, final TypeDescription typePointcut, final ClassLoader classLoader) {
-        this.advisorConfigs = advisorConfigs;
-        this.typePointcut = typePointcut;
-        adviceFactory = new AdviceFactory(classLoader, pluginConfigs, isEnhancedForProxy);
-    }
-    
-    /**
-     * Create static method advisor builder.
-     * 
-     * @param builder original builder
-     * @return created builder
-     */
-    public Builder<?> create(final Builder<?> builder) {
-        Builder<?> result = builder;
-        Collection<MethodAdvisor> matchedAdvisors = typePointcut.getDeclaredMethods()
-                .stream().filter(each -> each.isStatic() && !(each.isAbstract() || each.isSynthetic())).map(this::getMatchedAdvisor).filter(Objects::nonNull).collect(Collectors.toList());
-        for (MethodAdvisor each : matchedAdvisors) {
-            try {
-                if (each.getAdvice() instanceof StaticMethodInterceptorArgsOverride) {
-                    result = result.method(ElementMatchers.is(each.getPointcut()))
-                            .intercept(MethodDelegation.withDefaultConfiguration().withBinders(Morph.Binder.install(OverrideArgsInvoker.class)).to(each.getAdvice()));
-                } else {
-                    result = result.method(ElementMatchers.is(each.getPointcut())).intercept(MethodDelegation.withDefaultConfiguration().to(each.getAdvice()));
-                }
-                // CHECKSTYLE:OFF
-            } catch (final Throwable ex) {
-                // CHECKSTYLE:ON
-                LOGGER.error("Failed to load advice class: {}.", typePointcut.getTypeName(), ex);
-            }
-        }
-        return result;
-    }
-    
-    private MethodAdvisor getMatchedAdvisor(final InDefinedShape methodPointcut) {
-        List<StaticMethodAdvisorConfiguration> matchedAdvisorConfigs = advisorConfigs.stream().filter(each -> each.getPointcut().matches(methodPointcut)).collect(Collectors.toList());
-        if (matchedAdvisorConfigs.isEmpty()) {
-            return null;
-        }
-        if (1 == matchedAdvisorConfigs.size()) {
-            return getSingleMethodAdvisor(methodPointcut, matchedAdvisorConfigs.get(0));
-        }
-        return getComposedMethodAdvisor(methodPointcut);
-    }
-    
-    private MethodAdvisor getSingleMethodAdvisor(final InDefinedShape methodPointcut, final StaticMethodAdvisorConfiguration advisorConfig) {
-        StaticMethodAroundAdvice staticMethodAroundAdvice = adviceFactory.getAdvice(advisorConfig.getAdviceClassName());
-        return advisorConfig.isOverrideArgs()
-                ? new MethodAdvisor(methodPointcut, new StaticMethodInterceptorArgsOverride(staticMethodAroundAdvice))
-                : new MethodAdvisor(methodPointcut, new StaticMethodAroundInterceptor(staticMethodAroundAdvice));
-    }
-    
-    private MethodAdvisor getComposedMethodAdvisor(final InDefinedShape methodPointcut) {
-        Collection<StaticMethodAroundAdvice> staticMethodAroundAdvices = new LinkedList<>();
-        boolean isArgsOverride = false;
-        for (StaticMethodAdvisorConfiguration each : advisorConfigs) {
-            if (each.isOverrideArgs()) {
-                isArgsOverride = true;
-            }
-            if (null != each.getAdviceClassName()) {
-                staticMethodAroundAdvices.add(adviceFactory.getAdvice(each.getAdviceClassName()));
-            }
-        }
-        Object advice = isArgsOverride ? new ComposedStaticMethodInterceptorArgsOverride(staticMethodAroundAdvices) : new ComposedStaticMethodAroundInterceptor(staticMethodAroundAdvices);
-        return new MethodAdvisor(methodPointcut, advice);
-    }
-}