【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注解进行物理隔离,分别放在不同的实现类中

相关推荐
paopaokaka_luck31 分钟前
基于springboot3+vue3的支教志愿者管理系统(AI问答、协同过滤算法、Echarts图形化分析)
spring boot·echarts
2601_963870182 小时前
【计算机毕业设计】基于Vue+Spring Boot的助农电商系统的设计与实现
spring boot·后端·课程设计
野生技术架构师3 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
2602_959960924 小时前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
阿萨德528号5 小时前
npm 包发布实战指南:从零发布、更新迭代到版本治理
前端·npm·策略模式
【赫兹威客】浩哥5 小时前
基于SpringBoot+Vue3的舆情文本分析系统|Elasticsearch检索+情感分析+话题热度追踪 毕设项目
spring boot·elasticsearch·课程设计
weixin_BYSJ19876 小时前
springboot智慧公共交通系统---附源码51123
java·javascript·spring boot·python·django·flask·php
Lyyaoo.15 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
南城以南溫暖如初14717 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换