5-01 Spring 底层核心原理大致流程
2022-11-27 22:27:09 3 举报
01 Spring 底层核心原理整体大致示意图
作者其他创作
大纲/内容
<b>1. Bean的生命周期底层原理</b>
<b>大致流程:</b>
<font color="#000000">1、</font><b style=""><font color="#e57373">推断构造方法</font></b><font color="#000000">(实例化得到一个对象)</font>
2、<b><font color="#ffb74d">依赖注入</font></b>(@Autowired属性赋值)
3、<font color="#000000">Aware回调</font>(实现了BeanNameAware接口、Bean Class Loader Aware接口、Bean Factory Aware接口)
4、<font color="#4dd0e1"><b>初始化</b></font>
4.1. 初始化前(@PostConstruct)
4.2. 初始化(实现了InitializingBean接口)
5、<b><font color="#ba68c8">初始化后(AOP)</font></b>
需要AOP
代理对象Bean
不需要AOP
对象Bean
6、Bean(对象Bean 、 代理对象Bean)
<b>流程每阶段的底层原理:</b>
<font color="#000000">1、</font><font color="#e57373" style="font-weight: bold;">推断构造方法</font><font color="#000000" style="">底层原理</font>
如果:只存在一个构造方法
不管是无参构造方法,还是有参构造方法,Spring都会用这个构造方法
如果:存在多个构造方法
存在一个无参的构造方法,Spring会用这个无参的构造方法(默认)
不存在一个无参的构造方法,Spring就会报错
如果:在某个构造方法上加了@Autowired注解
表示:告诉Spring用这个加了注解的方法
如果:Spring选择了一个有参的构造方法,调用时需要传入参数,参数怎么来?
1. 先根据入参类型找,如果只找到一个,那就直接用来作为入参
2. 如果根据类型找到多个,则再根据入参名字来确定唯一一个
3. 最终如果没有找到,则会报错,无法创建当前Bean对象
这个确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做<b><font color="#2196f3">推断构造方法</font></b>
3、<b><font color="#ffb74d">依赖注入</font></b>底层原理
1. Spring判断是否存在被@Autowired注解了的属性
2. 如果存在,把这些属性找出并由Spring进行复制(依赖注入)
<b>4、</b><font color="#4dd0e1"><b>初始化</b></font><b>底层原理</b>
1. 初始化前,Spring判断是否存在被@PostConstruct注解了的方法,存在则调用当前对象的此方法
2. 初始化时,Spring判断该对象是否实现了InitializingBean接口,如果实现了,则Spring会调用该对象必定实现了afterPropertiesSet()方法
<b>5、</b><font color="#ba68c8">初始化后AOP</font><b>底层原理</b>
1、对象初始化后,Spring会判断创建Bean是否需要进行AOP
1、找出所有切面Bean
2、遍历切面中的每个方法,看是否加了@Before、@After等注解
3、如果写了,则判断所对应的Pointcut是否和当前Bean对象的类匹配
4、如果匹配,表示需要进行AOP,并将此缓存map(UserService.class, method)
2、如果需要AOP,则会进行动态代理,大致流程如下:
1. 生成代理类UserServiceProxy,代理类继承UserService
2. 代理类中重写了父类的方法,比如:UserService中的test()方法
3. 代理类中还会有一个target属性,该属性的值为被代理对象
4. 代理类中的test()方法被执行时的逻辑如下:
a. 先执行切面逻辑(@Before)
b. 再调用target.test();
<font color="#e57373">注:当我们从Spring容器得到的UserService的Bean对象时,拿到的就是UserServiceProxy所生成的对象,也就是代理对象。</font>
<b>大致流程示意图:</b>
<a class="link" target="_bank" href="https://www.processon.com/outline/6382bc001efad454984fe218">Spring 底层核心原理整体大致示意图</a>
<b>2. Spring事务底层原理</b>
1. 判断当前执行的方法是否存在@Transactional注解
2. 如果存在,则利用事务管理器(TransactionManager)新建一个数据库连接
3. 修改数据库连接的 autocommit 为false
4. 执行 target.test(), 执行业务逻辑代码sql
5. 执行结束,如果出现异常,则提交,否则回滚
注:Spring事务是否会失效的判断标准:判断加了@Transactional注解的方法被调用时,是不是直接被代理对象调用的,如果是则事务生效,如果不是则失败
0 条评论
下一页