关于java:源码解析Spring源码解析笔记一

7次阅读

共计 4633 个字符,预计需要花费 12 分钟才能阅读完成。

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,示意如果没有对象能够注入给属性则抛异样。

@Service
public 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 对象。
正文完
 0