Spring原理篇(1)--Spring创建Bean的生命周期

通过反射加载对象

UserService,Class

构造方法

默认无参构造方法

当有多个构造方法时,并且没有无参构造方法时,应当使用Autowired来指定

普通对象

依赖注入

初始化前PostConstruct

初始化InitializingBean

初始化后aop

代理对象

bean

1: 利用该类的构造方法来实例化一个对象(如果说有多个构造方法,那么Spring会自行选择,选择规则是 在没有@Autowired的时候 就会选择默认的,在没有默认的, 就会选择唯一一个 如果有多个就会报错,此时需要在构造方法内指定@Autowired);


2: 得到一个对象后 查看其属性是否被 @Autowired注解 ; 如果有那么Spring会从容器中寻找该对象进行注入;


3: 依赖注入之后,Spring会自行判断该对象是否实现了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口 如果有.那么就会调取其实现方法setBeanName()、setBeanClassLoader()、 setBeanFactory();那Spring就会调用这些方法并传入相应的参数(Aware回调)


4:Aware回调后,那么就会判断该类是否存在PostConstruct注解 了,如果存在,Spring会调用当前对象的此方法(初始化前)


5:紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就 表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化);


6:最后判断:Spring是否需要Aop,如果不需要.那么类就创建完毕(此时是普通对象);如果需要;那么就会 动态代理 由代理类来实现AOP;此时就是代理对象; 这个需要注意 普通对象与代理对象的区别! 代理对象 实际是就是为了实现AOP; 最后附上代码图 Debug进行解释在这里插入图片描述


Spring中使用Cglib 进行动态代理的呢;此处以伪代码进行解释

package com.example.service.impl;

import com.example.entity.Student;

import com.example.service.StudentService;

/**

  • 此处为cglib自己生产的代理类 并且继承

  • auth:huf

*/

public class StudentServiceProxy extends StudentServiceImpl{

StudentService target;// 使用的是是前面创建的Java普通对象;注意是普通对象

public int insert(Student stu){

/**

  • AOP的前置动作;Before

*/

//这个地方insert并非使用super.insert方法;

target.insert(stu);

/**

  • AOP的后置动作;

*/

}

}

AOP大致流程

===================================================================

AOP就是进行动态代理,在创建一个Bean的过程中,Spring在最后一步会去判断当前正在 创建的这个Bean是不是需要进行AOP,如果需要则会进行动态代理。如何判断当前Bean对象需不需要进行AOP:

1. 找出所有的切面Bean

2. 遍历切面中的每个方法,看是否写了@Before、@After等注解

3. 如果写了,则判断所对应的Pointcut是否和当前Bean对象的类是否匹配

4. 如果匹配则表示当前Bean对象有匹配的的Pointcut,表示需要进行AOP 利用cglib进行AOP的大致流程:

1). 生成代理类StudentServiceProxy,代理类继承StudentServiceImpl

2). 代理类中重写了父类的方法,比如StudentServiceImpl中的insert()方法

3). 代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过 UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的 对象)

4). 代理类中的test()方法被执行时的逻辑如下: a. 执行切面逻辑(@Before) b. 调用target.insert() 当我们从Spring容器得到StudentServiceImpl的Bean对象时,拿到的就是UserServiceProxy所生 成的对象,也就是代理对象。 StudentServiceImpl代理对象.insert()—>执行切面逻辑—>target.insert(),注意target对象不是代理 对象,而是被代理对象。

在复习过程中 修正之前跟一名同事 哲哲 说的 一个Spring原理:

注:Spring会根据入参的类型和入参的名字去Spring中找Bean对象,(以单例Bean为例, Spring会从单例池那个Map中去找):

1. 先根据入参类型找,如果只找到一个,那就直接用来作为入参

2. 如果根据类型找到多个,则再根据入参名字来确定唯一一个

3. 最终如果没有找到,则会报错,无法创建当前Bean对象

//在什么时候会有多个Bean同时存在在一个容器中: 代码举例

package com.example.config;

import com.example.entity.Student;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

  • BeanTest

*/

@Configuration

public class BeanTestConfig {

/**

  • 这种情况下 容器就会存在多个Bean并且 相互是独立的

  • 先通过类型进行查找. 这时候会找到三个Bean

  • 然后再通过名字 student1 最终定位到一个Bean;

  • @return

*/

@Bean

public Student student1(){

return new Student();

}

@Bean

public Student student2(){

return new Student();

}

}


总结

Spring中的 Bean的生命周期大致如上. Spring @Transactional 也是通过AOP实现的;其原理 就是把autocommit 由true改为false; 由代理类进行Commit; Spring原理 会持续更新 更新时间为每个星期 三篇左右;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
Q9-1713335077315)]

⑩安全:

[外链图片转存中…(img-OVTORKMC-1713335077315)]

⑪底层实现:

[外链图片转存中…(img-l868hCoA-1713335077315)]

⑫其他项目:

[外链图片转存中…(img-YjSkicwk-1713335077315)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值