【Policy】使用 InitializingBean 实现策略时如何避免AOP失效

使用InitializingBean实现策略模式

不同的注入方式对AOP注解的影响

部分策略代码及测试代码

java 复制代码
public interface TraditionOrderService extends InitializingBean {
  // ...
}
@Service
public class TraditionOrderServiceImpl implements TraditionOrderService {
  // afterPropertiesSet 注入方法见后续
}
  • 测试类
java 复制代码
@Autowired
private TraditionOrderService traditionOrderService;

InitializingBean invoicePolicyService = InvoicePolicyFactory.getByType(1);

1.使用this注入会导致所有的AOP注解失效

java 复制代码
@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, this);
}
  1. 实现类无AOP注解的注入结果(推荐)
  2. 实现类有AOP注解的注入结果
  • 这种方式给策略工厂注入的对象一定是非反向代理的对象,所以AOP注解都失效.

@Async @Transactional @GdLock @Monitor等注解都会失效

2.使用applicationContext.getBean()注入仅@Async失效

java 复制代码
@Autowired
private ApplicationContext applicationContext;
@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, applicationContext.getBean(TraditionOrderService.class));
}
  1. 实现类无AOP注解的注入结果
  2. 实现类只有@Async注解的注入结果
  3. 实现类有@Async和其他AOP注解的注入结果
  4. 实现类无@Async注解的注入结果(推荐)
  • 没有AOP注解或仅有@Async时,这种方式给策略工厂注入的对象是非反向代理的对象 ; 否则,注入CGLIB反向代理的对象 .所以,@Async外的AOP注解有效.

可以简单的认为@Async注解会失效,其他AOP注解有效.

3.使用@Autowired注入可能仅@Async有效

java 复制代码
@Lazy
@Autowired
private TraditionOrderService service;
@Override
public void afterPropertiesSet() {
  InvoicePolicyFactory.register(1, service);
}
  • 这种方式给策略工厂注入的对象一定是JDK反向代理的对象.

可以简单的认为@Async注解有效,其他AOP注解失效.

  1. 实现类无AOP注解的注入结果
  2. 实现类只有@Async注解的注入结果(推荐)
  3. 实现类无异步或混合的注入结果

总结

没有AOP注解(不需要反向代理)使用任意一种

没有@Async使用第二种

仅有@Async使用第三种

强烈建议把@Async和其他AOP注解进行物理隔离,分别放在不同的实现类中

相关推荐
高兴达2 小时前
Spring boot入门工程
java·spring boot·后端
幽络源小助理2 小时前
SpringBoot基于JavaWeb的城乡居民基本医疗信息管理系统
java·spring boot·学习
代码老y4 小时前
Spring Boot + 本地部署大模型实现:安全性与可靠性保障
spring boot·后端·bootstrap
RainbowSea5 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·spring
paopaokaka_luck8 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
陌殇殇11 小时前
SpringBoot整合SpringCache缓存
spring boot·redis·缓存
小林学习编程14 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
ladymorgana14 小时前
【Spring boot】tomcat Jetty Undertow对比,以及应用场景
spring boot·tomcat·jetty
IT_102414 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
DCTANT15 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss