Spring原理学习笔记
主要从一下几个方面介绍Spring底层思想与实现逻辑:
1. Bean的生命周期底层原理
2. 依赖注入底层原理
3. 初始化底层原理
4. 推断构造方法底层原理
5. AOP底层原理
6. Spring事务底层原理
- Bean的生命周期底层原理:
Spring框架会根据我们定义的类名称,通过类中的构造方法创建出对象,然后会查找对象中的属性是否使用@Autowire修饰,如果存在就将属性注入到对应的属性中,属性注入之后开始进行初始化,此时可以对对象做出干预操作(使用@PostContrurt注解或者使用@afterPropertitiesSet注解),然后完成初始化.初始化之后Spring框架会判断类中的方法有没有对应的AOP操作,如果有,则生成代理对象,执行切面操作,最后完成Spring Bean的创建.
2.依赖注入底层原理:Spring在扫描到使用@Autowire注解的属性时,会去Spring容器中尝试按照类型获取一个属性值将其注入,如果发现容器中有多个满足条件的属性(也即是bean对象),再根据名称来匹配.
3.初始化底层原理:经过属性注入后,Spring框架会扫描将要初始化的类中是否存在@Construt注解如果存在,先执行注解方法后再进行初始化对象.如果目标对象实现了initailizingBean接口,Spring会判断instance of initailizingBean,如果为ture则先执行afterPorpertitiesSet().进行初始化前的操作.后在继续进行实例化.
4.推断构造方法:默认使用无参构造进行初始化,如需使用特性的构造方法需要在方法上添加@AutoWire注解
5.AOP原理:当对象初始化完成后,Spring会判断该类中是否存在被切面标注的方法,如果存在则需要生成一个代理对象,此代理对象继承了目标类.
如何判断当前Bean对象是否选要进行AOP操作:
a.找出所有的切面Bean
b.遍历切面中的方法,是否存在@Before,@after @Around注解
c.如果写了,则判断所对应的PointCut是否和当前Bean对象的类匹配
d.如果匹配则表示当前Bean对象有匹配的PointCut,表示需要进行AOP操作
利用cgLib进行AOP的大致流程:
a.生成代理类xxxxProxy,代理类继承xxxx.class
b.代理类中重写了父类中方法
c.代理类中还会有一个target属性,该属性的值为被代理对象(也就是之前实例化处的普通对象,已经进行了依赖注入、初始化等步骤)
d.代理中的执行逻辑为:先执行切面逻辑(@Before@After@Around),再调用target.meth()对应的方法。
6.Spring事务底层原理:当我们再某个方法上标注了@Transactional注解后,就表示该方法再调用中会开始Spring事务,而这个方法所在的类的对象会是该类的代理对象。
Spring事务的代理对象执行某个方法时的步骤:
a.判断当前执行的方法是否存在@Transactional注解
b.如果存在,则利用事务管理器(TransactionManager)新建一个数据库连接
c.修改数据量连接autoCommit = false
d.执行target.meth(),执行逻辑代码中的sql
e.执行完如果没有异常抛出则提交,否则回滚
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。