目前,我以这种方式设置了 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
. 这是我遇到问题的地方。
根据这个 SO question,所有 BeanPostProcessor 及其直接引用的 bean 都将在启动时实例化,此外:由于 AOP 自动代理是作为 BeanPostProcessor 本身实现的,因此没有 BeanPostProcessors 或直接引用的 bean 有资格进行自动代理(因此不会有“编织”到其中的方面。
事实上,@Transactional 注释被忽略了,我得到一个错误:“No Hibernate session bound to this thread。”
我试图fb.setManager(manager());
从 VendorFactoryBean 移动调用并使用另一个 BeanPostProcessor 设置它,但是在这种情况下我不能这样做,因为 VendorFactoryBean 来自库并且它包含一个断言,即在实例化时必须已经设置了 Manager 实例。
想问一下这种情况有没有可能的解决办法。
编辑:this SO question中的具体示例。