首页 > 其他分享 >Spring原理学习笔记

Spring原理学习笔记

时间:2023-03-05 13:23:55浏览次数:34  
标签:初始化 对象 Spring 笔记 原理 注解 底层

Spring原理学习笔记

主要从一下几个方面介绍Spring底层思想与实现逻辑:
1. Bean的生命周期底层原理
2. 依赖注入底层原理
3. 初始化底层原理
4. 推断构造方法底层原理
5. AOP底层原理
6. Spring事务底层原理

  1. Bean的生命周期底层原理:
    将spring初始化对象的过程分为图中标注的步骤
    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注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。

标签:初始化,对象,Spring,笔记,原理,注解,底层
From: https://www.cnblogs.com/ekko-w/p/17180293.html

相关文章

  • JVM 类加载器、双亲委派原理
    类加载器ClassLoader作用:负责装入类。一个java程序运行,至少需要三个类加载器实例,负责加载不同类。BootstrapClassLoader是JVM内核内嵌加载器,主要负载加载JAVA_HOME/lib......
  • 已解决 springBoot HttpMessageConversionException的异常
    问题说明:近日重构springboot项目,启动后调用ControllerAPI异常提示:2022-12-0617:09:37.008javaERROR[http-nio-8080-exec-2]o.a.c.c.C.[.[.[.[dispatcherServlet]e......
  • activity学习笔记
    Activity学习笔记activiti是什么?业务流程管理(BPM)框架,开发人员可直接通过手绘流程图的方式,实现业务流程的控制。官网:http://www.activiti.org/下载:http://www.activit......
  • Spring Boot启动流程
    我们知道Spring Boot是一个服务于Spring框架的框架,辅助Spring应用达到自动化快速配置和一键启动!如果过去的Spring应用是一部普通汽车,那么Spring Boot加持下的Spring......
  • C语言学习笔记之 第六讲:头文件源文件以及include包含指令
    1、#include说明:#include后可以包含任意类型,不仅.h可以,也可以.c,也可以.cpp。也就是其他的代码文件可以利用#include直接调用。    #include内容不能重复包含,将会出现......
  • C语言学习笔记之 第四讲:C语言Windows命令行编程
    1、stdlib头文件即standardlibrary标准库头文件。stdlib头文件里包含了C、C++语言的最常用的​​系统函数​​该文件包含了C语言标准​​库函数​​的定义2、system()......
  • C语言学习笔记之 第一讲:C语言概述
    1、软件:一系列按照特定循序组织的计算机数据和指令的集合。2、软件分类:系统软件  应用软件3、人与计算机之间的交互方式:自然交互界面 声音、触摸屏控制  成就了......
  • C语言学习笔记之 第二讲:C语言环境简介
    1、C语言程序开发环境:MAC:      XcodeWindows:  VisualStudioLinux:      VI 、VIM  跨平台:   CodeBlocks、Eclipse、QT2、IDE:集成开发环境3......
  • 新概念2册L49笔记(分词做状语)
    L49Theendofadream单词讲解分词做状语课文理解......
  • SQL笔记--MySQL高级操作
    MySQL高级SQL操作数据新增多数据插入蠕虫复制主键冲突查询数据查询选项别名数据源where子句groupby子句having子句orderby子句limit子句更新数据限制更新删除数据限制......