场景:
spring aop使用过程遇到的异常信息的解决过程记录
问题描述
问题代码如下:
@Configuration
public class LogConfig {
@Bean
public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() {
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
pointcut.setPattern("org.example.dao.*");
return pointcut;
}
@Bean
public LogAdvice logAdvice() {
return new LogAdvice();
}
@Bean
public DefaultPointcutAdvisor pointcutAdvisor() {
DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor(jdkRegexpMethodPointcut(), logAdvice());
return pointcutAdvisor;
}
@Bean
public BeanNameAutoProxyCreator autoProxyCreator() {
BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
beanNameAutoProxyCreator.setBeanNames("*");
beanNameAutoProxyCreator.setInterceptorNames("pointcutAdvisor");
return beanNameAutoProxyCreator;
}
}
异常日志信息:
org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker postProcessAfterInitialization
信息: Bean 'logConfig' of type [org.example.aop.LogConfig$$EnhancerBySpringCGLIB$$942bab5f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
原因分析:
PostProcessor依赖bean。bean的创建过程不受PostProcessor影响。spring检测到后打印该日志。
解决方案:
将PostProcessor作为一个独立的类并使用@Component注解注册为bean。
代码如下:
// MyAutoProxyCreator.java
@Component
public class MyAutoProxyCreator extends BeanNameAutoProxyCreator {
@PostConstruct
private void init() {
super.setBeanNames("*");
super.setInterceptorNames("pointcutAdvisor");
}
}
// LogConfig.java
@Configuration
public class LogConfig {
@Bean
public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() {
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
pointcut.setPattern("org.example.dao.*");
return pointcut;
}
@Bean
public LogAdvice logAdvice() {
return new LogAdvice();
}
@Bean
public DefaultPointcutAdvisor pointcutAdvisor() {
DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor(jdkRegexpMethodPointcut(), logAdvice());
return pointcutAdvisor;
}
}