使用Spring AOP时,小心*PostProcessor陷阱

探讨了在使用Spring AOP实现事务控制时,如何正确处理BeanFactoryPostProcessor与ApplicationContextAware的区别。当使用BeanFactoryPostProcessor时,部分Bean无法被Spring代理;而通过ApplicationContextAware,则可以正常工作。

基于Spring AOP做事务控制,在引入BeanFactoryPostProcessor(BeanPostProcessor也一样)之前,一切OK。

但是在一个类实现了BeanFactoryPostProcessor接口,并通过以下代码进行处理时,发现很多原本由Spring代理的类,现在Spring不会代理了,而是直接实例化原始类。

代码如:

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{

Iterator ite = factory.getBeansOfType(MyProcessor.class).values().iterator();
while(ite.hasNext()) registerProcessor((MyProcessor) ite.next());

}

 

后来修改为实现ApplicationContextAware:

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

Iterator ite = applicationContext.getBeansOfType(MyProcessor.class).values().iterator();
while(ite.hasNext()) registerProcessor((MyProcessor) ite.next());

}

就一切OK了。

 

 

为此写了一个从Spring环境中获取特定类型Bean的基类:

public abstract class BeanAware implements ApplicationContextAware{

protected ApplicationContext appContext = null;

 

final public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

……

 

Map beans = applicationContext.getBeansOfType(getClass());

setBeanInstance((BeanAware) beans.values().iterator().next());

 

this.appContext = applicationContext;
afterApplicationContextInit(applicationContext);

}

 

/**
   * 实现本方法,接收spring组装的bean实例
   * @param bean spring组装的bean实例
   */
  protected abstract void setBeanInstance(BeanAware bean);

 

/**
   * Spring的上下文环境初始化完毕后的通知
   * @param appContext
   */
  protected void afterApplicationContextInit(ApplicationContext appContext) {
  }

}

 

基于AOP实现配置时,实现此基类,就可以正确的获得当前Bean实例和特定类型的Bean实例。

 

原因:BeanFactoryPostProcessor is designed to PostProcess a BeanFactory NOT the ApplicationContext. Bean in the Bean factory don't have transactions etc, only after the processing in the ApplicationContext the have transactions etc.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值