Spring源码解析笔记(一)

本文由colodoo(纸伞)整顿

QQ 425343603

Java学习交换群(717726984)

参考 https://www.bilibili.com/vide... 1-10章节

BeanDefinition

BeanDefinition示意Bean定义,Spring依据BeanDefinition来创立Bean对象,BeanDefinition有很多的属性用来形容Bean,BeanDefinition是Spring中十分外围的概念。

@Component、@Bean、<bean/>都会被解析成BeanDefinition。

配置属性蕴含

  • beanClass
  • scope
  • isLazy
  • dependsOn
  • primary
  • initMethodName

beanClass

示意一个bean的类型,比方UserService.class、OrderService.class,Spring在创立Bean 的过程中会依据此属性来实例化失去对象。

scope

示意一个bean的作用域,比方:

scope等于singleton,该bean就是一个单例Bean;

scope等于prototype,该bean就是一个原型bean。

isLazy

示意一个bena是不是须要懒加载,原型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进行加工。

BeanFactory

BeanFactory是一种“Spring容器”,BeanFactory翻译过去就是Bean工厂;它能够用来创立Bean、获取Bean,BeanFactory是Spring中十分外围的组件。

BeanDefintion、BeanFactory、Bean 关系

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

BeanFactory利用BeanDefinition产出Bean对象。

外围子接口和实现类

  • ListableBeanFactory
  • ConfigurableBeanFactory
  • AuwowireCapableBeanFactory
  • AbstractBeanFactory
  • DefaultListableBeanFactory

DefaultListableBeanFactory

反对单例Bean、反对Bean别名、反对父子BeanFactory、反对Bean类型转化、反对Bean后置解决、反对FactoryBean、反对主动拆卸,等等。

Bean生命周期

生命周期的几个阶段:

  • BeanDefinition -> Bean定义
  • 构造方法推断 -> 选出构造方法
  • 实例化 -> 构造方法反射实例化对象
  • 属性填充 -> 主动填充属性
  • 初始化 -> 对其余属性赋值、校验
  • 初始化后 -> AOP、生成代理对象

BeanDefinition

BeanDefinition示意Bean定义,它定义了某个Bean的类型,Spring就是利用BeanDefinition来创立Bean的,比方须要利用BeanDefinition中beanClass属性确定Bean的类型,从而实例化进去对象。

构造方法推断

一个Bean中能够有多个构造方法,此时就须要Spring来判断到底应用哪个构造方法,这个过程是比较复杂的,篇幅无限,不开展介绍。通过构造方法推断之后确定一个构造方法后,就能够利用构造方法实例化失去一个对象了。

实例化

通过构造方法反射失去一个实例化对象,在Spring中,能够通过BeanPostProcessor机制对实例化进行干涉。

属性填充

实例化所失去的对象,是“不残缺”的对象,“不残缺”的意思是该对象中的某些属性还没有进行属性填充,也就是Spring还没有主动给某些属性赋值,属性填充就是咱们通常说的主动注入、依赖注入。

初始化

在一个对象的属性填充之后,Spring提供了初始化机制,程序员能够利用初始化机制对Bean进行自定义加工,比方能够利用InitializingBean接口来对Bean中的其余属性进行赋值,或对Bean中的某些属性进行校验。

@Autowired

@Autowired示意某个属性是否须要进行依赖注入,能够写在属性和办法上。注解中的required属性默认为true,示意如果没有对象能够注入给属性则抛异样。

@Servicepublic class OrderService {        @Autowired    private UserService userService;    }

@Autowired加在某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化进去的对象,对该对象中加了@Autowired的属性主动给属性赋值。

Tip:操作步骤是在属性填充这一步。

构造方法

@Autowired加在构造方法上时,Spring会在推断构造方法阶段,抉择该构造方法来进行实例化,在反射调用构造方法之前,会先依据构造方法参数类型、参数名从Spring容器中找到Bean对象,当作构造方法入参。

@Resource

@resource如果name属性有值,那么Spring会间接依据所指定的name值取Spring容器找Bean对象,如果找到了则胜利,没有找到则报错。

@Value

@Value注解和@Resource、@Autowired相似,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中获取值的,并且@Value能够解析SpEL(Spring表达式)。

FactoryBean

FactoryBean是Spring所提供的一种较灵便的创立Bean的形式,能够通过实现FactoryBean接口中的getObject()办法来返回一个对象,这个对象就是最终的Bean对象。

接口办法:

  • Object getObject():返回的是Bean对象
  • boolean isSingleton():返回的是否是单例Bean对象
  • Class getObjectType():返回的是Bean对象的类型

代码:

@Component( "demo")public class DemoFactoryBean implements FactoryBean {        @Override    public 0bject get0bject() throws Exception {        return new Demo();    }    @Override    public class<?> get0bjectType() {        return Demo.class;    }    @Override    //所定义的Bean是单例还是原型    public boolean issingleton() {        return true;    }}

FactoryBean机制被宽泛的利用在Spring外部和Spring与第三方框架或组件的整合过程中。

FactoryBean和BeanFactory

FactoryBean

FactoryBean对象自身也是一个Bean,共事它相当于一个小型工厂,能够生产出另外的Bean。

BeanFactory

BeanFactory是一个Spring容器,是一个大型工厂,它能够生产出各种各样的Bean。

ApplicationContext

ApplicationContext是比BeanFactory更加弱小的Spring容器,它既能够创立bean、获取bean,还反对国际化、事件播送、获取资源等BeanFactory不具备的性能。

继承接口

  • EnvironmentCapable
  • ListableBeanFactory
  • HierarchicalBeanFactory
  • MessageSource
  • ApplicationEventPublisher

BeanPostProcessor

BeanPostProcessor在Spring中是一个接口,咱们定义一个后置执行器,就是提供一个类实现该接口,在Spring中还存在一些接口继承了BeanPostProcessor,这些接子接口是在BeanPostProcessor的根底上减少了一些其余的性能。

BeanPostProcessor中的办法

postProcessBeforelnitialization():初始化前办法,示意能够利用这个办法来对Bean在初始化前进行自定义加工。

postProcessAfterlnitialization):初始化后办法,示意能够利用这个办法来对Bean在初始化后进行自定义加工。

InstantiationAwareBeanPostProcessor

BeanPostProcessor的一个子接口,
postProcessBeforelnstantiation():实例化前

postProcessAfterlnstantiation():实例化后postProcessProperties():属性注入后

AOP

Aop就是面向切面编程,是一种非常适合在无需批改业务代码的前提下,对某个或某些业务减少对立的性能,比方日志记录、权限重置、事务管理等,能很好的使得代码解耦,进步开发效率。

  • Advice
  • Pointcut
  • Advisor
  • Weaving
  • Target
  • Join Point

Advice

Advice能够了解为告诉、倡议,在Spring中通过定义Advice来定义代理逻辑。

Pointcut

Pointcut是切点,示意Advice对应的代理逻辑利用在哪个类、哪个办法上。

Advisor

Advisr等于Advice+Pointcut,示意代理逻辑和切点的一个整体,程序员能够通过定义或封装一个Advisor,来定义切点和代理逻辑。

Weaving

Weaving示意织入,将Advicedialing逻辑在源代码级别嵌入到切面得过程,就叫做织入。

Target

Target示意指标对象,也就是被代理对象,在AOP生成的代理对象中对持有指标对象。

Join Point

Join Point示意连接点,在Spring AOP中,就是办法的执行点。

AOP工作原理

AOP是产生在Bean的生命周期过程中的;

  • Spring生成bean对象时,先实例化进去一个对象,也就是target对象。
  • 再对target对象进行属性填充。
  • 在初始化步骤中,会判断target对象有没有对应的切面。
  • 如果有切面,就示意以后target对象须要进行AOP。
  • 通过Cglib或JDK动静代理机制生成一个代理对象,作为最终的bean对象。
  • 代理对象中有一个target属性只想了target对象。