【Spring核心原理剖析】

文章目录

  • 一、Bean生命周期原理理解
  • 二、依赖注入底层原理理解
  • 三、初始化底层原理理解
  • 四、推断构造方法底层原理理解
  • 五、AOP底层原理理解
  • 六、Spring事务底层原理理解

一、Bean生命周期原理理解

在未引入Spring之前,我们知道,创建一个对象都是相关开发人员通过new 的方式创建其对象,引入后,创建对象以及对象的销毁都交由Spring全权管理,那Spring在创建对象时,是一个什么的过程,经历了那些步骤,具体我们可见下图:
【Spring核心原理剖析】_第1张图片
由图中,我们可以看到,Spring创建Bean时,是经历了很多步骤的,具体为:多个构造方法场景需要构造方法推断=>创建实例对象=>属性填充(被Autowired注解的)=>是否存在回调操作(实现相关的Aware接口)=>初始化前(方法上是否有@PostConstruct)=>初始化方法(对象是否实现initialzingBean接口)=>初始后方法,会进行AOP操作

二、依赖注入底层原理理解

在对对象中属性被@Autowired注解的,需要进行属性赋值,那底层是如何去实现的呢?首先是根据其对象利用反射机制,获取的到对象的全部属性,会进行逐个判断其是否加了相关注解信息,若加了,就需要进行属性赋值,具体是如何赋值的,详细过程和会遇到一些问题(例如循环依赖问题)和解决方案,在之后的探索中,我们再进行深挖,这里我们先了解各大概即可

三、初始化底层原理理解

Spring创建Bean的过程中,如果需要在对象创建后,得到一些初始的数据或相关逻辑处理,那就需要在对象创建过程中,进行赋值或者相关逻辑处理,这个过程就发生在初始化前、初始化、初始化后某个过程中,例如:初始化前的原理就为=>会判断当前对象方法上是否被@PostConstruct注解方法,如果加注解,就会在这个过程执行该方法,初始化方法就是判断对象是否实现initialzingBean接口,如果实现了该接口,就表示当前对象必须实现其接口方法afterPropertisSet(),在这步,Spring就会调用当前对象的此方法,也就是初始化

四、推断构造方法底层原理理解

无论是手动创建对象还是Spring创建对象,都需要先确定其对象的构造方法,那Spring中判断的逻辑如下:

1. 如果一个类只存在一个构造方法,不管该构造方法是无参还是含参,Spring都会使用该构造方法进行创建对象
2. 如果一个类中存在多个:
a、这些构造方法中,存在一个无参构造,那么Spring就会用这个无参构造
b、这些构造方法中,不存在一个无参构造方法,那Spring就会报错

五、AOP底层原理理解

AOP就是会进行动态代理,在创建一个Bean的过程中,Spring在最后一步会判断当前正在创建的这个Bean是不是需要AOP,其判断是否需要AOP的逻辑如下:

1. 找出所有的切面Bean
2. 遍历当前切面Bean,且遍历其Bean中的每个方法,判断是否写了@Before、@After等注解
3. 如果写了,则判断所对应的Pointcut是否和当前的Bean对象类是否匹配
4. 如果匹配,则表示当前Bean对象有匹配的Pointcut,表示需要进行AOP

利用CGlib进行AOP的大致流程如下:

1. 生成代理类,这个代理是继承至当前对象
2. 代理类中会重写父类的方法,在这个重写方法中,会在执行父类方法前后进行AOP逻辑处理
3. 代理类中还会有一个target属性,该属性的值为被代理对象
4. 代理类中的方法被执行逻辑乳4如下:
a、执行切面逻辑
b、调用target.方法()

六、Spring事务底层原理理解

当我们在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。Spring事务的代理对象执行某个方法时的步骤:
1. 判断当前执行的方法是否存在@Transactional注解
2. 如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接
3. 修改数据库连接的autocommit为false
4. 执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql
5. 执行完了之后如果没有出现异常,则提交,否则回滚
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效

你可能感兴趣的:(Spring相关,spring,java,数据库)