文章目录

  • 问题
  • 加载流程
  • BeanFactoryPostProcessor的执行时机
  • Code


问题

Spring创建的Bean 和 我们提供的Class对象 有什么关系吗? 一定是我们提供的这个对象实例吗?


加载流程


BeanFactoryPostProcessor的执行时机

结合上图的流程,我们可以得出如下结论

  1. 在bean被转换成BeanDefinition之后
  2. 在实例化bean之前

中间这个部分,如果用户实现了BeanFactoryPostProcessor接口,则可以对BeanDefinition进行修改


Code

演示下这个功能

两个类 一个可以被Spring扫描到的bean Artisan1 , 另外一个是普通的对象 Artisan2

package com.artisan.bd;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class Artisan1 {@PostConstructpublic void  init(){System.out.println("Artisan1 Created");}
}

标注了 @Component

package com.artisan.bd;import javax.annotation.PostConstruct;public class Artisan2 {}

普通对象


配置类

package com.artisan.bd;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.artisan.bd")
public class AppConfig {}

测试类

package com.artisan.bd;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(ac.getBean(Artisan1.class));System.out.println(ac.getBean(Artisan2.class));}
}

同时我们也看到了 Artisan1这个对象,对应的 BeanDefinition中的beanClass也是 Artisan1 .

那能改么? 能改成Artisan2吗?


看了刚才的流程图,我们知道如果实现了BeanFactoryPostProcessor接口,就可以修改BeanDefinition。

试试吧

package com.artisan.bd;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;@Component
public class ArtisanBeanFactoryPostProcessor implements BeanFactoryPostProcessor {/*** beanFactory 就是流程图中的 bdmap    BeanDefinition的map集合* @param beanFactory the bean factory used by the application context* @throws BeansException*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 取出A对应的 beanDefinition -----> 这时候bd中存放的类是A.classGenericBeanDefinition beanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("artisan1");//ScannedGenericBeanDefinition beanDefinition1 = (ScannedGenericBeanDefinition) beanFactory.getBeanDefinition("artisan1");// 将bd中的beanclass修改为BbeanDefinition.setBeanClass(Artisan2.class);}
}


使用实现类来接收 beanFactory.getBeanDefinition(“artisan1”) 的返回值,可用方法更多,接口中的方法太少,并且也木有我们要用的setBeanClassName 方法。

别忘了加@Component,不然spring无法扫描到,这个就不会生效 。

再此执行刚才的代码

同时,通过name artisan1 获取到的bean 其实是被修改后了的, 因为Sping根据用户提供的Artisan2, 实例化了Artisan2


再比如说修改scope

都明白了哈, 后面从源码的角度分析 ~

Spring5源码 - 02 Bean和Java对象的区别与猜想验证BeanDefinition相关推荐

  1. Spring5源码 - 03 普通对象对应的BeanDefinition是如何存入DefaultListableBeanFactory#beanDefinitionMap 源码分析

    文章目录 Pre Spring处理bdmap 的理念 源码分析 Step1 : `this();` [初始化BeanFactory] register(componentClasses); [注册be ...

  2. Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02

    文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...

  3. Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_3细说invokeBeanDefinitionRegistryPostProcessors

    文章目录 Pre 细说invokeBeanDefinitionRegistryPostProcessors 流程图 源码分析 解析配置类 parser.parse(candidates) 配置类注册到 ...

  4. Spring源码解析-bean实例化

    Spring源码解析-bean实例化 ​ 本文介绍Spring创建 bean 过程中的第一个步骤:实例化 bean. 1. Bean实例化源码 ​ 虽然实例化Bean有多种方式(包括静态工厂和工厂实例 ...

  5. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  6. Spring5源码 - 11 Spring事件监听机制_源码篇

    文章目录 pre 事件监听机制的实现原理[观察者模式] 事件 ApplicationEvent 事件监听者 ApplicationEvent 事件发布者 ApplicationEventMultica ...

  7. Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_2

    文章目录 Pre 源码解读 总体流程 源码分析 细节解析 [初始化对应的集合 & 遍历用户自己手动添加的后置处理器] [调用实现了PriorityOrdered接口的BeanDefinitio ...

  8. Spring5源码 - 04 invokeBeanFactoryPostProcessors 源码解读_1

    文章目录 Pre refresh() Spring的设计 源码验证 Pre 接上文 Spring5源码 - 03 普通对象对应的BeanDefinition是如何存入DefaultListableBe ...

  9. Spring-bean的循环依赖以及解决方式___Spring源码初探--Bean的初始化-循环依赖的解决

    本文主要是分析Spring bean的循环依赖,以及Spring的解决方式. 通过这种解决方式,我们可以应用在我们实际开发项目中. 什么是循环依赖? 怎么检测循环依赖 Spring怎么解决循环依赖 S ...

最新文章

  1. 75道常见AI面试题,看看你的知识盲点在哪?(附解析)
  2. java struts2 session mysql 内存不足_Java - 用户在线的数据库实现方法和内存实现方法...
  3. 《CSS揭秘》笔记(一)
  4. 转: mysql create view 创建视图
  5. 科研诚信与学术规范_大学教授学术造假,违背科研诚信
  6. Git分布式版本管理
  7. python 放射 水平_基于Python的放射性核素大气扩散程序初步开发与验证
  8. 地面指示标志_消防应急照明与疏散指示系统的设计和施工安装规范,收藏学习!...
  9. Zcash已发布ZIP 313提案
  10. antd vue form 手动校验_vue测试模板与jsonSchema自动生成elment组件
  11. viewpage切换动画
  12. 从韩国的大数据之殇,看技术的产业价值与功能价值
  13. 计算机组成原理课程试题,计算机组成原理课程复习考试试题及答案B.doc
  14. sorry, unimplemented: non-trivial designated initializers not supported
  15. 未来5年互联网,运营将成比产品更加有前途的职业?
  16. 基于TT 双WAN固件(dualwan)下的QOS脚本 很给力
  17. 数据查询(sql运算符)
  18. Linux和windows下minio+springboot实现文件服务器上传下载和nginx反向代理
  19. centos7查看oracle监听端口,CentOS 7开放及查看防火墙firewall的端口
  20. 怎么权衡不同类型项目的收益产出比 ROI?

热门文章

  1. win7驱动程序未经签名可以使用吗_如何解决高校机房计算机新CPU不支持win7系统的问题...
  2. beautiful loss function
  3. wps 项目进度_平安科技软件+金山WPS测试面试题
  4. 隐式马可夫模型(hidden markov model,HMM)
  5. 文巾解题1588. 所有奇数长度子数组的和
  6. pyecharts应用3 Faker函数库
  7. MATLAB实战系列(二十八)-用matlab爬取火车票信息
  8. 趣话题:底层码农的心酸,那么我们 如何避免成为底层码农呢?
  9. 第8天:我用AI算法造了一些“网红”
  10. 【Python刷题】_10