5-01 Spring 底层核心原理大致流程
2022-11-27 22:27:09 3 举报
01 Spring 底层核心原理整体大致示意图
作者其他创作
大纲/内容
1. Bean的生命周期底层原理
大致流程:
1、推断构造方法(实例化得到一个对象)
2、依赖注入(@Autowired属性赋值)
3、Aware回调(实现了BeanNameAware接口、Bean Class Loader Aware接口、Bean Factory Aware接口)
4、初始化
4.1. 初始化前(@PostConstruct)
4.2. 初始化(实现了InitializingBean接口)
5、初始化后(AOP)
需要AOP
代理对象Bean
不需要AOP
对象Bean
6、Bean(对象Bean 、 代理对象Bean)
流程每阶段的底层原理:
1、推断构造方法底层原理
如果:只存在一个构造方法
不管是无参构造方法,还是有参构造方法,Spring都会用这个构造方法
如果:存在多个构造方法
存在一个无参的构造方法,Spring会用这个无参的构造方法(默认)
不存在一个无参的构造方法,Spring就会报错
如果:在某个构造方法上加了@Autowired注解
表示:告诉Spring用这个加了注解的方法
如果:Spring选择了一个有参的构造方法,调用时需要传入参数,参数怎么来?
1. 先根据入参类型找,如果只找到一个,那就直接用来作为入参
2. 如果根据类型找到多个,则再根据入参名字来确定唯一一个
3. 最终如果没有找到,则会报错,无法创建当前Bean对象
这个确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做推断构造方法
3、依赖注入底层原理
1. Spring判断是否存在被@Autowired注解了的属性
2. 如果存在,把这些属性找出并由Spring进行复制(依赖注入)
4、初始化底层原理
1. 初始化前,Spring判断是否存在被@PostConstruct注解了的方法,存在则调用当前对象的此方法
2. 初始化时,Spring判断该对象是否实现了InitializingBean接口,如果实现了,则Spring会调用该对象必定实现了afterPropertiesSet()方法
5、初始化后AOP底层原理
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();
注:当我们从Spring容器得到的UserService的Bean对象时,拿到的就是UserServiceProxy所生成的对象,也就是代理对象。
大致流程示意图:
2. Spring事务底层原理
1. 判断当前执行的方法是否存在@Transactional注解
2. 如果存在,则利用事务管理器(TransactionManager)新建一个数据库连接
3. 修改数据库连接的 autocommit 为false
4. 执行 target.test(), 执行业务逻辑代码sql
5. 执行结束,如果出现异常,则提交,否则回滚
注:Spring事务是否会失效的判断标准:判断加了@Transactional注解的方法被调用时,是不是直接被代理对象调用的,如果是则事务生效,如果不是则失败
0 条评论
下一页