【发布时间】:2012-08-11 12:42:48
【问题描述】:
我有一个 bean B,我必须自己创建它(使用 new B()),它有 @Autowire 和 @PostConstruct 注释。
如何让 Spring 从我的 bean A 处理这些注释?
相关问题:
【问题讨论】:
我有一个 bean B,我必须自己创建它(使用 new B()),它有 @Autowire 和 @PostConstruct 注释。
如何让 Spring 从我的 bean A 处理这些注释?
相关问题:
【问题讨论】:
Aaron,我相信您的代码是正确的,但我使用了以下代码:
B bean = new B();
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean( bean );
factory.initializeBean( bean, "bean" );
第一个方法将处理@Autowire 字段和方法(但不是经典属性)。第二种方法将调用后处理(@PostConstruct 和任何定义的BeanPostProcessors)。
如果实现ApplicationContextAware接口,则可以在bean中获取应用程序上下文。
【讨论】:
processInjection() 只会填充 @Autowired 字段,而您的代码也应该处理 @PostConstruct(至少根据 JavaDoc)。 :-/
@Transactional注解,它是否也创建了一个动态代理?
new 创建的,因此 Spring 无法用代理替换实例。此处的解决方案是将所有 @Transactional 方法移动到您注入到 B 的辅助 bean 中。
initializeBean()返回代理版本,所以最后一行应该是:bean = factory.initializeBean( bean, "bean" );
另一个选择是让spring容器自动创建一个新bean(而不是自己用new关键字创建一个新实例)。 在需要以编程方式实例化一个新的类中,注入一个实例 AutowireCapableBeanFactory:
@Autowired
private AutowireCapableBeanFactory beanFactory;
然后:
B yourBean = beanFactory.createBean(B.class);
容器会像往常一样注入带有@Autowired注解的实例。
【讨论】: