Spring源码学习Day01

Spring源码

什么是BeanDefinition?

BeanDefinition表示Bean定义,Spring根据BeanDefinition来创建Bean对象,BeanDefinition有很多的属性用来描述Bean,BeanDefinition是Spring中非常核心的概念。

重要的属性:

beanclass:表示一个bean的类型,比如UserService.class,Spring在创建Bean的过程中会根据此属性来实例化的到对象。

scope:表示一个bean的作用域,比如scope等于singleton,该bean就是一个单例Bean,scope等于prototype该bean就是一个原型bean。

isLazy:表示一个bean是不是需要懒加载,原型bean的isLazy属性不起作用,懒加载的单例bean,会在第一个getBean的时候生成该bean,非懒加载的单例bean,则会在Spring启动过程总直接生成好。

dependsOn:表示一个bean在创建之前所依赖的其他bean,在一个bean创建之前,它所依赖的这些ean得先全部创建好。

primary:表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性。

initMethodName:表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫初始化,spring会在这个步骤中去调用bean 的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工。

平时使用的@Component @Bean和bean标签都会解析成BeanDefinition

BeanFactory

BeanFactory是一种“Spring容器”,BeanFactory可以用来创建Bean、获取Bean,是Spring中非常核心的组件。

工作流程:

BeanFactory将利用BeanDefinition来生成Bean对象,BeanDefinition相当于BeanFactory的原材料,Bean对象就相当于BeanFactory所生产出来的产品。

核心子接口和实现类:ListableBeanFactory、ConfigurableBeanFactory、AutowireCapableBeanFactory、AbstractBeanFactory、DefaultListableBeanFactory

DefaultListableBeanFactory比较重要,主要支持单例Bean、支持Bean别名、支持父子BeanFactory、支持Bean类型转化、支持Bean后置处理、支持自动装配。

Bean生命周期

Bean生命周期的是Spring中一个Bean创建过程和销毁过程中所经历的步骤,其中Bean创建过程是重点。程序员可以利用Bean生命周期机制对Bean进行自定义加工。

构造方法推断:一个Bean中可以有多个构造方法,此时就需要Spring来判断到底使用哪个构造方法,通过构造方法推断之后确定一个构造方法后,就可以利用构造方法实例化得到一个对象了。

实例化:通过构造方法反射得到一个实例化对象,在Spring中,可以通过BeanPostProcessor机制对实例化进行干预。

属性填充:实例化所得到的对象是不完整的对象,不完整的意思是该对象中的某些属性还没有进行属性填充,也就是Spring还没有自动给某些属性赋值,属性填充就是通常说的自动注入、依赖注入。

初始化:在一个对象的属性填充之后,Spring提供了初始化机制,程序员可以利用初始化机制对Bean进行自定义加工,比如可以利用InitializingBean接口来对Bean中的其他属性就行复制,或对Bean中的某些属性进行校验。

初始化后:初始化后是Bean创建生命周期中最后一个步骤,我们常说AOP机制,就是在这个步骤中通过BeanPostProcessor机制实现的,初始化后得到的对象才是真正的Bean对象。

@Autowired

@Autowired表示某个属性是否需要进行依赖注入,可以写在属性和方法上。注解中的required属性默认为true,表示如果没有对象可以注入给属性则抛异常。

@Autowired加载某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了@Autowired的属性自动给属性赋值。Spring会先根据属性的类型去Spring容器中找出该类型所有的Bean对象,如果找出来多个,则根据属性的名字从多个中再确定一个。如果required为true,并且根据属性信息找不到对象,则直接抛异常

当@Autowired注解写在某一个方法上时,Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器找到对象当做方法入参,自动反射调用该方法。

@Resource

@Resource注解与@Autowired类似,也是用来进行依赖注入的,@Resource是Java层面所提供的注解,@Autowired是Spring所提供的注解,他们依赖注入的底层实现逻辑也不同。

@Resource如果name属性有值,那么Spring会直接根据所指定的name值取Spring容器找对象,如果找到则成功,没有找到就会报错。

@Resource如果name属性没有值,则:

1、先判断该属性名字在Spring容器中是否存在Bean对象

2、如果存在,则成功找到Bean对象进行诸如。

3、如果不存在,则根据属性类型去Spring容器找Bean对象,找到一个则进行注入。

对于学习Spring源码的网站,可以参考以下链接: 1. Spring官方网站:https://spring.io/ 在官方网站上,你可以找到关于Spring的所有文档、教程和源码下载链接。它是学习Spring的首要资源。 2. GitHub上的Spring源码仓库:https://github.com/spring-projects/spring-framework 这是Spring源码的官方GitHub仓库,你可以在这里找到最新的Spring源码,并参与到开发讨论中。 3. CSDN博客:https://blog.csdn.net/navyfrost/article/details/102919323 这是一篇关于Spring源码学习的博客文章,作者分享了学习Spring源码的心得和方法,并提供了一些学习资源和案例。 希望以上资源可以帮助你开始学习Spring源码。祝你学习顺利!<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* [Spring源码学习加注释,方便学习.zip](https://download.csdn.net/download/weixin_47367099/85350853)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* *4* [Spring源码学习系列——源码下载和环境](https://blog.csdn.net/shangguoli/article/details/124710529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值