将自定义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