我必须创建一个可配置的切入点。任何人都可以帮助实现动态切入点。
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;
}
}
您可以使用静态aspectOf工厂方法连接您的方面(您无法看到该方法,它由aspectj编译器添加)
<bean class="com.YourAspect" factory-method="aspectOf">
<property name="basePackage"
value="${custom.logging.basepackage}" />
在您的场景中使用Spring中的AspectJ支持。
@Aspect
@Component
public class DaoAspect{
@Pointcut("within(com.xyz..dao.*)")
public void allDao(){};
@Before("allDao")
public void runAdvise(){
//some code
}
}