使用InitializingBean实现策略模式
- 参考策略模式示例中的第一种实现方式.
- 代码
demo
项目
不同的注入方式对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);
}
- 实现类无AOP注解的注入结果(推荐)
- 实现类有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));
}
- 实现类无AOP注解的注入结果
- 实现类只有
@Async
注解的注入结果
- 实现类有
@Async
和其他AOP
注解的注入结果
- 实现类无
@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
注解失效.
- 实现类无AOP注解的注入结果
- 实现类只有
@Async
注解的注入结果(推荐)
- 实现类无异步或混合的注入结果
总结
没有AOP
注解(不需要反向代理)使用任意一种
没有@Async
使用第二种
仅有@Async
使用第三种
强烈建议把@Async
和其他AOP
注解进行物理隔离,分别放在不同的实现类中