在创建每个其他Bean之前,我需要注册一系列的BeanDefinition。这是因为那些注册的Bean(s)是自动连接和ApplicationContext#getBean调用所需要的。
显然,我不能使用@DependsOn。
示例:
final var beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(...);
beanDefinition.setLazyInit(true);
beanDefinition.setAbstract(false);
beanDefinition.setAutowireCandidate(true);
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
registry.registerBeanDefinition("...", beanDefinition);我可以使用哪个点/接口/lister来获得这个?请记住,我需要一个BeanDefinitionRegistry实例。
按需要添加解释.
这些定义是通过扫描类路径收集的类列表创建的。这些类本身并不是Spring,所以我需要将它们集成到我的ApplicationContext中。然而,这些类接受作为Spring的构造函数参数。
这就是为什么我要
beanDefinition.setAutowireCandidate(true);
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);这些新注册的Bean在那里被其他Bean(本地Bean)使用。
发布于 2019-02-04 11:54:36
你试图使解决方案过于复杂。如果您的唯一目标是通过组件扫描检测非@Component注释类,并将它们作为Spring使用,那么只需为@COmponentScan定义一个自定义includeFilter。
您可以使用ASPECTJ或REGEX类型的筛选器来匹配包或类型。
@ComponentScan(includeFilter = @Filter(type=REGEX, expression="com.foo.bar.*))这样的东西会自动检测你的bean(假设它们在被扫描的包装中),并从它们中创建spring bean。如果它们有一个将自动用于创建实例的构造函数。
发布于 2019-02-04 11:46:29
在上下文中注册一个新的BeanFactoryPostProcessor或BeanDefinitionRegistryPostProcessor bean。在扫描bean定义之后,但在构建实际bean之前,将调用此bean:
扩展到标准的BeanFactoryPostProcessor SPI,允许在常规BeanFactoryPostProcessor检测开始之前注册进一步的BeanFactoryPostProcessor定义。特别是,BeanDefinitionRegistryPostProcessor可以注册进一步的bean定义,这些定义反过来定义BeanFactoryPostProcessor实例。
https://stackoverflow.com/questions/54515099
复制相似问题