目前,我以这种方式设置了 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中的具体示例。