所以首先简短介绍:
我有一个有效的应用程序上下文,现在我想创建一个新的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定义,以便正确进行自动装配?

最佳答案

因此,我发现了我所缺少的:
AutowiredAnnotationBeanPostProcessor
需要将其添加到bean factory中以启动@Autowired@Value批注。

同样对于@PostConstruct@PreDestroy,您需要CommonAnnotationBeanPostProcessor

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

关于java - Spring动态Bean定义 Autowiring ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31863537/

10-09 05:35