【发布时间】:2013-04-03 03:44:48
【问题描述】:
目前我有一个这样设置的 Spring 配置:
@Bean
@Autowired
public Manager manager(DataRetriever dataRetriever) {
Manager m = new Manager();
m.setRetriever(dataRetriever); //DataRetriever is a @Component bean
return m;
}
@Bean
public VendorFactoryBean factory() {
final VendorFactoryBean fb = new VendorFactoryBean();
fb.setManager(manager());
return fb;
}
VendorFactoryBean 需要 Manager 实例。 Manager豆>DataRetriever豆。
在DataRetriever 内我有一个@Transactional 注释,如下所示:
@Component("dataRetriever")
public class DataRetriever {
@Transactional public void retrieveStuff() {...}
}
现在,VendorFactoryBean 实现了 BeanPostProcessor。这就是我遇到问题的地方。
根据this SO question,所有 BeanPostProcessor 及其直接引用的 bean 都会在启动时被实例化,另外:由于 AOP 自动代理是作为 BeanPostProcessor 本身实现的,因此没有 BeanPostProcessor 或直接引用的 bean 符合条件自动代理(因此不会将方面“编织”到其中。
事实上,@Transactional 注释被忽略了,我得到一个错误:“No Hibernate session bound to this thread。”
我试图从 VendorFactoryBean 中移动 fb.setManager(manager()); 调用并使用另一个 BeanPostProcessor 设置它,但是在这种情况下我不能这样做,因为 VendorFactoryBean 来自库并且它包含一个断言,即在实例化时 Manager 实例必须已经设置好了。
想问一下这种情况是否有可能的解决方案。
编辑:具体示例in this SO question。
【问题讨论】:
标签: spring