首先简短介绍:
我有一个工作的应用程序上下文,现在我想创建一个新的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定义,以便正确自动装配?
答案 0 :(得分:1)
所以我发现了我所缺少的东西:
AutowiredAnnotationBeanPostProcessor
需要将其添加到bean工厂以启动@Autowired
和@Value
注释。
也适用于@PostConstruct
和@PreDestroy
,您需要CommonAnnotationBeanPostProcessor
通过spring boot为应用程序上下文创建的Bean工厂总共有12个bean后处理器,因此可能需要其他一些才能获得所有功能。