spring源码学习

72 阅读6分钟

什么是BeanDefinition?

  • BeanDefinition 表示bean定义,spring根据BeanDefinition来创建Bean对象,BeanDefinition有很多的属性用来描述Bean.

BeanDefinition中重要的属性:

  • 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创建之前,它所依赖的这些bean得先全部创建好;
  • primary : 表示一个bean是主bean,在spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性
  • initMethodName : 表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫初始化,Spring会在这个步骤中去调用bean的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工;

image.png

什么是BeanFactory?

BennFactory是一种“Spring容器”,也叫Bean工厂,它可以用来创建Bean,获取Bean;

image.png

BeanFactory的核心子接口和实现类

  • ListableBeanFactory

  • ConfigurableBeanFactory

  • AutowireCapableBeanFactory

  • AbstractBeanFactory

  • DefaultListableBeanFactory !!
    DefaultListableBeanFactoryd的功能: 支持单例Bean、支持Bean别名、支持父子BeanFactory,支持Bean类型转化、支持Bean后置处理、支持FactoryBean、支持自动装配 等等

    什么是bean生命周期

    Bean生命周期描述的是Spring中一个Bean创建过程和销毁过程;程序员可以利用Bean生命周期机制对Bean进行自定义加工。

  1. BeanDefinition表示bean定义,它定义了某个Bean的类型

  2. 构造方法推断,一个bean中可能有多个构造方法,此时就需要spring来判断到底使用哪个构造方法

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

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

  5. 在一个对象的属性填充之后,Spring提供了初始化机制,开发者可以利用初始化机制对Bean进行自定义加工,比如可以利用InitializingBean接口来对Bean中的其他属性进行赋值,或对bean中的某些属性进行校验;

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

@Autowired是什么?

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

  • @Autowired加在某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了@Autowired的属性自动赋值
  • Spring会先根据属性的类型去Spring容器中找出该类型所有的bean对象,如果找出来多个,则再根据属性的名字从中确定一个;如果required属性为true,并且根据属性信息找不到对象,则直接抛出异常
  • 当@Autowired注解写在某个方法上时,Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器中找到对象当做方法入参,自动反射调用该方法

@Resource是什么?

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

@Value是什么?

@Value注解和@Resource、@Autowired 类似,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中获取值的,并且@Value可以解析SpEl(spring表达式)

image.png

image.png

image.png

FactoryBean是什么?

FactoryBean是Spring所提供的一种较灵活的创建Bean的方式,可以通过实现FactoryBean接口中的getObject()方法来返回一个对象,这个对象就是最终的Bean对象

image.png

image.png

AppclicationContext是什么?

ApplicationContext是比BeanFactory更加强大的Spring容器

image.png

image.png

image.png

image.png

image.png

image.png

image.png

BeanPostProcessor是什么?

BeanPostProcessor是spring所提供的一种扩展机制,可以利用该机制对Bean进行定制化加工。通过也被叫做bean后置处理器 BeanPostProcessor在Spring中是一个接口,我们定义一个后置处理器,就是提供一个类实现该接口,在Spring中还存在一些接口继承了BeanPostProcessor,这些子接口是在BeanPostProcessor的基础上增加了一些其他的功能

BeanPostProcessor中的方法

  • postProcessBeforeInitialization():初始化前方法,表示可以利用这个方法来对Bean在初始化前进行自定义加工
  • postProcessAfterInitialization():初始化后方法,表示可以利用这个方法来对Bean在初始化后进行自定义加工

InstantiationAwareBeanPostProcessor

  • 它是BeanPostProcess的一个子接口
  • postProcessBeforeInstantiation():实例化前
  • postProcessAfterInstantiation():实例化后
  • postProcessProperties(): 属性注入后