iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么动态注册Bean到Spring
  • 342
分享到

怎么动态注册Bean到Spring

2023-06-29 16:06:29 342人浏览 泡泡鱼
摘要

这篇文章主要介绍了怎么动态注册Bean到spring的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么动态注册Bean到Spring文章都会有所收获,下面我们一起来看看吧。1、理论一般如果想将类注册到sprin

这篇文章主要介绍了怎么动态注册Bean到spring的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么动态注册Bean到Spring文章都会有所收获,下面我们一起来看看吧。

1、理论

一般如果想将类注册到spring容器,让spring来完成实例化,常用方式如下:

  • xml中通过bean节点来配置;

  • 使用@Service、@Controller、@Conponent等注解。

最近在研究通过Spring初始化时扫描自定义注解,查到了通过实现BeanDefinitionReGIStryPostProcessor获取Bean,从而获得自定义注解。

Spring支持我们通过代码来将指定的类注册到spring容器中。

怎么动态注册Bean到Spring

Spring容器初始化时,从资源中读取到bean的相关定义后,保存在BeanDefinitionMap,在实例化bean的操作就是依据这些bean的定义来做的,而在实例化之前,Spring允许我们通过自定义扩展来改变bean的定义,定义一旦变了,后面的实例也就变了,而beanFactory后置处理器,即BeanFactoryPostProcessor就是用来改变bean定义的。

怎么动态注册Bean到Spring

通过invokeBeanFactoryPostProcessors方法用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,BeanFactoryPostProcessor的实现类在其postProcessBeanFactory方法被调用时,可以对bean的定义进行控制,因此BeanDefinitionRegistryPostProcessor的实现类一共要实现以下两个方法:

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException

该方法的实现中,主要用来对bean定义做一些改变。

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException

该方法用来注册更多的bean到spring容器中,详细观察入参BeanDefinitionRegistry接口,看看这个参数能带给我们什么能力。

怎么动态注册Bean到Spring

从BeanDefinitionRegistry可以看到,BeanDefinitionRegistry提供了丰富的方法来操作BeanDefinition,判断、注册、移除等方法都准备好了,我们在编写postProcessBeanDefinitionRegistry方法的内容时,就能直接使用入参registry的这些方法来完成判断和注册、移除等操作。

org.springframework.context.support.AbstractApplicationContext#refresh中的invokeBeanFactoryPostProcessors(beanFactory);

用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

invokeBeanFactoryPostProcessors(beanFactory)实际上是委托

org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

方法处理的。

怎么动态注册Bean到Spring

首先处理BeanFactoryPostProcessor中的内容:

怎么动态注册Bean到Spring

所有实现了BeanDefinitionRegistryPostProcessor接口的bean,其postProcessBeanDefinitionRegistry方法都会调用,然后再调用其postProcessBeanFactory方法,这样一来,我们如果自定义了BeanDefinitionRegistryPostProcessor接口的实现类,那么我们开发的postProcessBeanDefinitionRegistry和postProcessBeanFactory方法都会被执行一次;

boolean reiterate = true;while (reiterate) {    reiterate = false;    //查出所有实现了BeanDefinitionRegistryPostProcessor接口的bean名称    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);    for (String ppName : postProcessorNames) {        //前面的逻辑中,已经对实现了PriorityOrdered和Ordered的bean都处理过了,因此通过processedBeans过滤,processedBeans中没有的才会在此处理        if (!processedBeans.contains(ppName)) {            //根据名称和类型获取bean            BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);            //把已经调用过postProcessBeanDefinitionRegistry方法的bean全部放在registryPostProcessors中            registryPostProcessors.add(pp);            //把已经调用过postProcessBeanDefinitionRegistry方法的bean的名称全部放在processedBeans中            processedBeans.add(ppName);            //执行此bean的postProcessBeanDefinitionRegistry方法            pp.postProcessBeanDefinitionRegistry(registry);            //改变退出while的条件            reiterate = true;        }    }}/registryPostProcessors中保存了所有执行过postProcessBeanDefinitionRegistry方法的bean,//现在再来执行这些bean的postProcessBeanFactory方法invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);//regularPostProcessors中保存的是所有入参中带来的BeanFactoryPostProcessor实现类,并且这里面已经剔除了BeanDefinitionRegistryPostProcessor的实现类,现在要让这些bean执行postProcessBeanFactory方法

2、实战代码

public class AnnotationScannerConfigurer implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {// 创建一个bean的定义类的对象RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestServiceImpl.class);// 将Bean 的定义注册到Spring环境beanDefinitionRegistry.registerBeanDefinition("testService", rootBeanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {  // bean的名字为key, bean的实例为valueMap<String, Object> beanMap = configurableListableBeanFactory.getBeansWithAnnotation(AutoDiscoverClass.class);}

其实在实际使用过程中,Spring启动时扫描自定义注解,是通过BeanFactoryPostProcessor接口的postProcessBeanFactory方法

configurableListableBeanFactory.getBeansWithAnnotation(AutoDiscoverClass.class);

获取每一个有自定义注解的Bean。

这种方法没满足我的实际需求。

关于“怎么动态注册Bean到Spring”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么动态注册Bean到Spring”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么动态注册Bean到Spring

本文链接: https://www.lsjlt.com/news/325596.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么动态注册Bean到Spring
    这篇文章主要介绍了怎么动态注册Bean到Spring的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么动态注册Bean到Spring文章都会有所收获,下面我们一起来看看吧。1、理论一般如果想将类注册到sprin...
    99+
    2023-06-29
  • BeanDefinitionRegistryPostProcessor如何动态注册Bean到Spring
    目录1、理论2、实战代码总结下1、理论 一般如果想将类注册到spring容器,让spring来完成实例化,常用方式如下: xml中通过bean节点来配置;使用@Service、@Co...
    99+
    2024-04-02
  • Spring Bean中Bean的注册是什么
    这篇文章主要介绍“Spring Bean中Bean的注册是什么”,在日常操作中,相信很多人在Spring Bean中Bean的注册是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr...
    99+
    2023-06-29
  • 向Spring IOC容器动态注册bean实现方式是什么
    本篇内容主要讲解“向Spring IOC容器动态注册bean实现方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“向Spring IOC容器动态注册bean实现方式是什...
    99+
    2023-07-02
  • Spring中动态注入Bean的方法
    这篇文章将为大家详细讲解有关Spring中动态注入Bean的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、基于标注的方式注入实例需要在Bean初始化之时,其依赖的对象必须初始化完毕。如果被注入的对...
    99+
    2023-05-30
    spring bean
  • 向SpringIOC容器动态注册bean实现方式
    目录本文的大纲从一个需求谈起Spring Bean的生命周期再完善BeanDefinitionBean 加入IOC容器的几种方式从spring容器中动态添加或移除bean本文的大纲 ...
    99+
    2024-04-02
  • Spring怎么为singleton bean注入prototype bean
    本篇内容介绍了“Spring怎么为singleton bean注入prototype bean”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细...
    99+
    2023-07-02
  • Spring Bean注册与注入实现方法详解
    目录1. 逻辑上的 Bean 注册2. XML 注册 Bean 到自建的库中2.1 工厂方法2.2 使用工厂方法和实例化工厂注册 Bean3. XML 配合注解进行 Bean 注册4...
    99+
    2022-11-13
    Spring Bean注册与注入 Spring Bean注册 Spring Bean注入
  • Android中使用Receiver怎么实现动态注册与静态注册
    Android中使用Receiver怎么实现动态注册与静态注册?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。广播接收器注册一共有两种形式 : 静态注册和动态注册.两者及其接...
    99+
    2023-05-31
    android receiver roi
  • oracle动态注册和静态注册监听器
         oracle动态注册和静态注册的区别:动态监听不需要在listener.ora文件中记录关于数据的任何信息,只需要将监听器的配置信息写入到该文件。例如:&n...
    99+
    2024-04-02
  • Oracle监听的静态注册和动态注册
    静态注册:通过解析listene.ora文件 动态注册:由PMON进程动态注册至监听中 在没有listener.ora配置文件的情况下,如果启动监听,则监听为动态注册。用图形化netca创建...
    99+
    2024-04-02
  • Android中怎么实现动态注册
    这期内容当中小编将会给大家带来有关Android中怎么实现动态注册,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一种写法:首先新建一个Java类,通过"New/Other/Broadcast ...
    99+
    2023-06-04
  • Spring注解@Configuration与@Bean注册组件如何使用
    今天小编给大家分享一下Spring注解@Configuration与@Bean注册组件如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-07-02
  • 详解Spring系列之@ComponentScan批量注册bean
    目录回顾本文内容@ComponentScan基本原理和使用基本原理使用案例定义组件定义配置类容器扫描和使用@ComponentScan进阶使用源码简析案例1:使用Filters过滤案...
    99+
    2024-04-02
  • Spring的@Bean注解怎么使用
    今天小编给大家分享一下Spring的@Bean注解怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spring @Be...
    99+
    2023-07-02
  • spring怎么自定义bean注入
    在Spring中,我们可以使用两种方式来自定义Bean的注入: 使用注解方式:通过在Bean定义类上添加注解来告诉Spring容...
    99+
    2023-10-26
    spring
  • Spring注解@Configuration与@Bean注册组件的使用详解
    目录原始Spring开发Person.javapom.xmlbean.xmlPersonTest.java注解Spring开发原始Spring开发 Person.java 准备Per...
    99+
    2024-04-02
  • Vue中怎么动态创建注册component
    这期内容当中小编将会给大家带来有关Vue中怎么动态创建注册component,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。常规组件声明与注册// 定义一个名为&...
    99+
    2024-04-02
  • Spring @Conditional通过条件控制bean注册过程
    目录Spring对配置类的处理主要分为2个阶段配置类解析阶段bean注册阶段Spring对配置类处理过程源码位置整个过程大致的过程ConfigurationCondition接口Co...
    99+
    2023-02-08
    Spring @Conditional控制bean注册 Spring @Conditional
  • Spring IOC源码之bean的注册过程讲解
    目录BeanDefition加载注册过程进入obtainFreshBeanFactory方法​进入AbstractRefreshableApplicationContex...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作