前几天遇到一个AOP内部调用不生效的问题,在网上查找了一些办法
1、使用@EnableAspectJAutoProxy(exposeProxy = true)注解
然后调用AopContext.currentProxy() 获取当前代理对象调用需要使用的方法
2、实现BeanPostProcessor接口,重写postProcessAfterInitialization方法,在初始化的时候手动注入需要用到的对象
第一种方法 我试了下没起作用后台会报错,大概意思设置exposeProxy = true可是我已经设置了
分析原因可能是我用定时器调用的方法而AopContext.currentProxy() 是使用ThreadLocal存储的当前代理,可能是线程上下文不一致导致获取不到单签代理。
第二种方法是好用的附上代码方便以后自己看,
@Configuration
public class InjectBeanSelfProcessor implements BeanPostProcessor, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//如果Bean不是MyService跳过
if (!(bean instanceof MyService)) {
return bean;
}
MyService service = (MyService) bean;
//如果当前对象是AOP代理对象,直接注入
if (AopUtils.isAopProxy(bean)) {
service.setSelf(bean);
} else {
//如果当前对象不是AOP代理,则通过context.getBean(beanName)获取代理对象并注入
//此种方式不适合解决prototype Bean的代理对象注入
service.setSelf(applicationContext.getBean(beanName));
}
return bean;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
//如果有多个类需要内部调用,可以用接口定义
//然后实现接口就行了
public class MyService {
MyService proxySelf;
public void setSelf(Object proxyBean) {
this.proxySelf = (MyService) proxyBean;
}
}