Spring动态bean定义autowire

时间:2015-08-06 18:45:12

标签: java spring

首先简短介绍: 我有一个工作的应用程序上下文,现在我想创建一个新的bean工厂,用一些动态bean定义扩展它。 所以我创建了一个新的DefaultListableBeanFactory实例,将基础应用程序上下文作为父项传递。 然后我创建一个新的bean定义:

BeanDefinition beanDef = BeanDefinitionBuilder.rootBeanDefinition(beanType)
                                              .setScope(BeanDefinition.SCOPE_PROTOTYPE)
                                              .setLazyInit(false)
                                              .setAbstract(false)
                                              .setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_ALL)
                                              .getBeanDefinition();

最后我将它注册到新创建的bean工厂

beanFactory.registerBeanDefinition(beanName, beanDef);

然后一段时间后我想获得该bean的新实例,所以我这样做:

Object beanInstance = beanFactory.getBean(jobType);

现在我希望用@Autowired注释的字段被初始化..但是没有。致电beanFactory.autowireBean(beanInstance)无济于事。

在基础应用程序上下文中查找其他一些bean定义后,我可以看到我的definitoin没有任何属性,我可以通过调用beanDef.setAttribute()添加它们,但这需要我提前知道它们。

现在提问。有没有办法以编程方式创建完全初始化的bean定义,以便正确自动装配?

1 个答案:

答案 0 :(得分:1)

所以我发现了我所缺少的东西: AutowiredAnnotationBeanPostProcessor 需要将其添加到bean工厂以启动@Autowired@Value注释。

也适用于@PostConstruct@PreDestroy,您需要CommonAnnotationBeanPostProcessor

通过spring boot为应用程序上下文创建的Bean工厂总共有12个bean后处理器,因此可能需要其他一些才能获得所有功能。