1

I have to create a configurable pointcut. Can anyone help for achieving the dynamic pointcut.

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;
    }

}
Pritam Banerjee
  • 17,953
  • 10
  • 93
  • 108
Mahesh
  • 11
  • 3

2 Answers2

0

You can wire up your aspect using the static aspectOf factory method (you can't see that method, it is added by the aspectj compiler)

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

Reference: autowiring in aspect

surya
  • 2,581
  • 3
  • 22
  • 34
0

Use AspectJ support in Spring for your scenario.

@Aspect
@Component
public class DaoAspect{

    @Pointcut("within(com.xyz..dao.*)")
    public void allDao(){};

    @Before("allDao")
    public void runAdvise(){
        //some code
    }

}
  1. Define DaoAspect
  2. Enable aspectJ support in spring by using @EnableAspectJAutoProxy
  3. Ensure your aspect gets registered as bean via component scanning
  4. There you go, this way you can advise all the classes in a particular package
Arjun Patil
  • 101
  • 5