【问题标题】:Creating a pointcut for all the classes in package?为包中的所有类创建切入点?
【发布时间】:2019-03-02 09:44:27
【问题描述】:

我必须创建一个可配置的切入点。任何人都可以帮助实现动态切入点。

DynamicPointcut.class

public class DynamicPointcut extends DynamicMethodMatcherPointcut {

    @Value("${custom.logging.basepackage}")
    String basePackage;

    @Override
    public ClassFilter getClassFilter() {
        return new ClassFilter() {

            @Override
            public boolean matches(Class<?> clazz) {
                List<Class<?>> classList = ClassFinder.find(basePackage);
                return classList.stream().anyMatch(x -> x.equals(clazz));
            }

        };
    }

    @Override
    public boolean matches(Method method, Class<?> targetClass, Object... args) {
        if(args.length>0){
            return true;
        }
        return false;
    }

}

ConfigurableAdvisorConfig.class

@Configuration
public class ConfigurableAdvisorConfig {

    @Autowired
    private ProxyFactoryBean proxyFactoryBean;

    @Autowired
    DefaultPointcutAdvisor defaultPointcutAdvisor;

    DynamicPointcut pointcut = new DynamicPointcut();

    NonProductionLoggingAspect advice = new NonProductionLoggingAspect();

    String[] advisor;


    List<Advisor> advisorList = new ArrayList<Advisor>();

    @Bean
    public String[] defaultPointcutAdvisor(){

        defaultPointcutAdvisor.setAdvice(new NonProductionLoggingAspect());
        defaultPointcutAdvisor.setPointcut(new DynamicPointcut());
        advisor = new String[]{"defaultPointcutAdvisor"};
        return advisor;
    }

    @Bean
    public ProxyFactoryBean proxyFactoryBean(){
        proxyFactoryBean.setInterceptorNames(advisor);
        return proxyFactoryBean;
    }

}

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

    您可以使用静态 aspectOf 工厂方法连接您的方面(您看不到该方法,它是由 aspectj 编译器添加的)

    <bean class="com.YourAspect" factory-method="aspectOf">
    <property name="basePackage"
              value="${custom.logging.basepackage}" />
    

    参考: autowiring in aspect

    【讨论】:

      【解决方案2】:

      为您的场景使用 Spring 中的 AspectJ 支持。

      @Aspect
      @Component
      public class DaoAspect{
      
          @Pointcut("within(com.xyz..dao.*)")
          public void allDao(){};
      
          @Before("allDao")
          public void runAdvise(){
              //some code
          }
      
      }
      
      1. 定义 DaoAspect
      2. 在 spring 中使用 @EnableAspectJAutoProxy 启用 aspectJ 支持
      3. 确保您的方面通过组件扫描注册为 bean
      4. 你去吧,这样你就可以为所有课程提供建议 特定包

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多