向Spring上下文中添加自定义bean

5
我有一些带有自定义注解的类,这些类不应该被实例化(抽象类,只是真正bean的子组件)。但在这些类的基础上,在运行时,在上下文初始化阶段,我想向应用程序上下文中添加额外的bean。

因此,基本上我需要扫描类路径,处理结果,并将新的bean引入当前应用程序上下文。

似乎spring-mvc、spring-tasks和spring-integration都在做这个(我试图从源代码学习,但没有成功)

我发现我可以创建自己的BeanFactoryPostProcessor,扫描类路径并调用registerSingleton来注册我的自定义bean。但我不确定这是否是引入新bean的好方法(似乎仅用于现有bean的后处理)。我相信还有一些Spring内部工具可以重用以简化流程。

介绍额外的bean到Spring上下文初始化的常规方法是什么?


也许是这个?https://dev59.com/wXRB5IYBdhLWcg3wxZ1K - noahlz
找到这样的类并不是问题,我只是不知道如何在Spring初始化阶段内完成它,并且如何为这样的类创建一个新的bean。 - Igor Artamonov
2个回答

4
你的观察是正确的,BeanFactoryPostProcessor 是 Spring 提供的两种机制之一,用于在将 bean 定义/实例提供给应用程序之前修改它们(另一种是使用 BeanPostProcessors )。
你完全可以使用 BeanFactoryPostProcessors 来添加/修改 bean 定义,以下是 Spring 集成代码库中的一个示例,如果用户未显式指定,则添加 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);

2

至少有两种方法可以将自定义注释类包含为bean定义:

  • 使用 @Component 注释自定义注释
  • <context:component-scan/> 中添加类型注释的 include 过滤器

例如:

<context:component-scan base-package="org.example">
        <context:include-filter type="annotation" expression="org.example.Annotation"/>
</context:component-scan>

接下来你可以使用一个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

参见AnnotationConfigUtils.registerAnnotationConfigProcessors()以获取内部Spring注解后处理器的示例代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接