Spring源码解析<1>

本文深入剖析Spring框架中Bean的注册过程,包括BeanDefinition的创建、通用注解的处理及Bean的容器注册机制。同时,详细解读了DefaultListableBeanFactory的作用与refresh方法的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.第二次看Spring源码了,编程这东西或者说代码这东西,得要用心去学,沉下心 这样才能有所成就
在这里插入图片描述
配置类不多说
在这里插入图片描述、吧这个类加入到Spring容器
在这里插入图片描述
//---------->看的出来我们Spring容器已经构造好了 ,
在这里插入图片描述
// 点进去 他首先调用一个this(); 这个this()先调用父类的构造方法 再调用自己的无参构造
然后我们看看他这个父类的构造方法做了什么
在这里插入图片描述
好了 记住这个类 ---------> 他就是我们的Bean工厂 名字叫做DefaultListableBeanFactory
//然后看他自己的构造方法
在这里插入图片描述
new 一个reader,顾名思义 一个读取器这个reader叫什么
AnnotatedBeanDefinitionReader,
首先啊 我们的明白BeanDefinition是干嘛的
我们java中用来描述一个类的信息 是用Class描述的 比如说类名 Class.getName 或者说Class.getSimpleName,
例如
User{
int age ;
}
我们也可以通过Class拿到这个类的属性 以及方法 对不对
所以说啊 我们java 中是通过Class对象来描述一个类的

好了 Spring中是通过这个BeanDefinition 来描述Bean的信息 的
比如说 这个Bean
在这里插入图片描述
比如说这个Bean是单利的还是原型的 对吧,
Spring当中的beandefination 又分为好多种,因为他是接口啊,比如说Spring内置的Bean,XML的Bean ,此处我们是AnnotatedBeanDefinition也就是说加了注解的Bean,这个Scanner此处没多大用处 暂时先不解析他
也就是说this()里面干了2个事情 一个是 new了一个reader 一个是得到Bean工厂

  1. 然后啊我们开始分析 他下一个方法
    在这里插入图片描述
看见没  这个类使我们传进来的  也就是appconfig ,这个register  可以解析单个Bean 也可以解析一个配置

在这里插入图片描述
看见没此时我传一个UserService的类 他不报错
在这里插入图片描述
我们把这个类继续点进去 到这个方法来doRegisterBean
1,就是说将这个Class转成BeanDefination
也就是说Spring如何将一个类转成BeanDefination
new一个BeanDefination 吧Class穿进去就可以
2>之前说过BeanDefination是来描述Spring的bean的 此处给这个BeanDefination赋值 比如说Scope 单利 你此时吧这个Scope改成prototype ,Spring生产出来的Bean就是多例的了,但是不推荐啊 因为你把Spring源码改了
3>
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
这个方法主要是用来解析通用注解的
在这里插入图片描述
1>abd.getMetadata()) 这个叫做元数据 ,Spring 中将Bean的信息主要保存在这里 ,
比如说第一个Lazy 看这个Bean是不是加了@Lazy 如果加了的话就用Lazy,如果没加的话就用默认值
=================================
来一波分割线 接下来
在这里插入图片描述
他这个也是解析通用注解的 只不过我们传值得时候给传了一个Null,
也就是说Spring解析通用注解有2种方法 1.>就是加一个@Lazy标签 通过 AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);来解析
第二种就是说你从外部调用在这里插入图片描述调拥他就可以 ,此处是我们吧他设置为null
接下来就是整个register最核心的方法了
在这里插入图片描述
首先第一点1.>BeanDefinitionHolder 他只是一个数据结构,将beanDefination 和BeanName绑到一起的
2>就是说BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
3>解释下BeanDefinitionRegistry 这个类主要是向Spring容器中注册BeanDefination的 怎么说呢
在这里插入图片描述
看这个方法,接着点进去
在这里插入图片描述
也就是说在这个DefaultListableBeanFactory 工厂中定义了起码定义了3个容器 一个是beanDefinitionMap 用于存放beanName 和beanDefinition,一个是beanDefinitionNames 这个List集合存BeanName
-----------------------> 好了
我们说下register 这个方法主要干了那些事情
1> 将一个类转成BeanDefination
2>处理这个类的通用注解 比如说@Lazy
3>就是把这个类放入Spring容器中
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName)

然后我们接下来看下面的 refresh() 这个方法
refresh() 这个方法可是Spring容器中的重中之重
在这里插入图片描述 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 这个方法就是说得到DefaultListableBeanFactory
在这里插入图片描述
然后主要的prepareBeanFactory(beanFactory);
在这里插入图片描述
他此时在这个容器中add了一个BeanPostProcessor,此处我们的明白BeanPostProcessor是什么
这个BeanPostProcessor叫做后置处理器,是Spring当中一个扩展点也就是说我们实现这个BeanPostProcessor就可以对Spring进行扩展
在这里插入图片描述
我此处写个小Demo就能看出来也就是说在Bean初始化之前执行一个方法 在初始化之后执行一个方法
在这里插入图片描述
对于这个接口的解释我也写了
在这里插入图片描述
他添加了一个它 此时
在这里插入图片描述
所以啊 此时我们到这个类里面找呢个接口的实现方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200317101935589.png
看到没 setApplicationContext()
也就是说我们一个对象

也就是说我们一个类实现了ApplicationContextAware 就可以动态获取到容器,继而可以动态的从容器中获取一个类
在这里插入图片描述
看见了没 ,假如某天的需求让我们从Spring容器中获取一个Bean我们可以通过这个类来获取一个类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值