将自定义bean添加到Spring上下文
我有一些带有自定义注释的类,不应该实例化(抽象类,它只是真正的bean的子组件)。 但是在这些类之上,在运行时,在上下文初始化阶段,我想将额外的bean放入应用程序上下文中。
因此,基本上我需要扫描类路径,处理结果,并将新bean引入curent应用程序上下文。
似乎spring-mvc,spring-tasks和spring-integration正在这样做(我试图从源头学习它 – 没有运气)
我发现我可以创建自己的BeanFactoryPostProcessor
,扫描类路径并为我的自定义bean调用registerSingleton
。 但我不确定这是引入新bean的好方法(似乎它只用于exce beans bean的后期处理)。 我相信有一些Spring内部工具可以重复使用以简化流程。
在Spring上下文初始化中引入额外bean的常规方法是什么?
您的观察实际上是正确的, BeanFactoryPostProcessor是Spring提供一种机制来修改bean定义/实例然后使它们可用于应用程序(另一种是使用BeanPostProcessors )的两种方式之一
您绝对可以使用BeanFactoryPostProcessors来添加/修改bean定义,这里有一个来自Spring Integration代码库的示例,如果没有用户明确指定,它会添加一个errorChannel,您可以使用类似的代码来注册新的bean:
RootBeanDefinition errorChannelDef = new RootBeanDefinition(); errorChannelDef.setBeanClassName(IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.PublishSubscribeChannel"); BeanDefinitionHolder errorChannelHolder = new BeanDefinitionHolder(errorChannelDef, IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME); BeanDefinitionReaderUtils.registerBeanDefinition(errorChannelHolder, registry);
至少有两种方法可以将自定义注释类包含为bean定义:
- 使用@Component注释自定义注释
- 将带有类型注释的包含filter添加到
例如:
然后,您可以使用BeanPostProcessor
来实例化它们,例如:
public class CustomAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter @Override public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException { if (beanClass.isAnnotationPresent(org.example.Annotation.class)) { Object bean = createBeanInstance(); ... return bean: } return null; } }
或者使用BeanFactoryPostProcessor
来处理ScannedGenericBeanDefinitions
。
有关内部Spring注释后处理器的示例代码,请参阅AnnotationConfigUtils.registerAnnotationConfigProcessors()
。
您正在寻找BeanDefinitionRegistryPostProcessor 。
在此处找到: 以编程方式将Bean添加到Spring Web App上下文
请参阅此链接有关BeanPostProcessors和BeanFactoryPostProcessors http://springindepth.com/book/in-depth-ioc-bean-post-processors-and-beanFactory-post-processors.html