所以首先简短介绍:
我有一个有效的应用程序上下文,现在我想创建一个新的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/