首页 Spring🍃
文章
取消

Spring🍃

Spring(IOC、AOP)

一.IOC

1.概念

​ IOC是Inversion Of Control 意思为控制翻转 指对Java Bean 对象的控制 由程序员 反转到Spring容器 ​ 在Spring容器中 Bean对象被Spring容器管理着 Bean对象有着严格的生命周期 Bean对象存储在一个Map集合中 ​ 作用为 降低了耦合度和对象的依赖性 同时让资源容易管理

2.实现

​ 通过DI注入 依赖注入的方式 实现IOC ​ 依赖注入:Spring对象将Bean对象的实例创建出来 提供给外部使用 ​ 依赖注入的实现方式: ​ ·setter注入 ​ ·构造器注入 ​ ·接口注入

3.Bean的生命周期

​ 1⃣️通过反射实例化Bean对象 ​ 2⃣️填充Bean对象属性- populate() ​ 3⃣️调用Aware接口的相关方法 完成对Beanname、BeanFactory、BeanClassLoader的赋值 ​ 4⃣️调用BeanPostProcess前置处理方法 设置 Application上下文 ​ 5⃣️调用initMethod方法 判断是否实现initializingBean接口 实现了调用AfterProeritesSet方法 没实现不调用 ​ 6⃣️调用BeanPostProcess后置处理方法 -Spring的AOP就是在这里实现的 注册desctrction相关回调接口 ​ 7⃣️getBean()方法获取Bean对象 ​ 8⃣️Bean对象的销毁

4.IOC的底层实现

​ 1⃣️通过creatBeanFactory方法创建 线程工厂 ​ 2⃣️开始循环创建对象 因为是单例方式创建所以默认是优先通过getBean或者getDoBean方式创建 如果找不到的话creatBean或者doCreatBean方式创建对象 ⬆️以上为通过反射实例化Bean ​ 3⃣️填充对象的属性 populate方法 ​ 4⃣️其他初始化过程

5.循环依赖♻️

​ 1⃣️概述:循环引用 指 Bean之间相互引用 形成闭环 ​ 2⃣️分类:1.setter方式引起 2.构造器引起 ​ 3⃣️解决:1.构造器引起的不能解决 抛出异常BeanCurrentCreation ​ 2.setter方式引起的循环依赖:可以通过 三级缓存➕提前曝光未初始化的完全的对象解决 ​ ·A发生对象通过反射实例化后 让其存放到三级缓存中 虽然对象不完美但还是能根据对象的引用定位到堆 结果就是让对象提前曝光 ​ ·然后发现其依赖B 然后去getBean(B) 没有的话去 creatBean(B) 然后就去创建B对象 然后又走流程 ​ ·然后发现B依赖A 然后去getBean(A) 去一二三级缓存找 找到了的话 B拿到了A的未初始化完全的对象 完成对象属性填充和初始化 存到自己缓存 ​ ·然后A拿到B初始化完全的对象 完成初始化 ​ 大概思路:A对象初始化完全后存到三级缓存中 发现 A依赖B 就去getBean 没有就去CreatBean 然后创建B 然后发现依赖A 就去Get A A在三级 缓存了 拿到A对象 完成B的初始化 A拿到B对象 也完成初始化 结束

二.AOP

1.概念

​ aop的意思为面向切面编程

2.作用

​ 把横切性的代码(日志监控等重复性代码) 和 核心业务代码分离 达到解耦 提高代码等复用性和可读性

3.原理

​ 总:通过动态代理去实现 ​ 分: ​ AOP是BeanPostProcess后置处理方法时候产生的 现有的IOC再有的AOP ​ 具体流程: ​ 代理对象创建 ​ 通过JDK动态代理或者CGLIB创建对象 ​ 执行方法的时候 调用产生的字节码文件 定位到Dynamic Advance Interpeter 类中的Interper方法 ​ 根据之前定义好的通知生成拦截器 ​ 然后从拦截器获取通知 然后执行

4.JDK动态代理和CGLIB的区别

​ 1.JDK动态代理是在运行时创建接口的代理实例 而CGLIB是用底层的字节码技术 在运行时创建类的代理实例 ​ 2.CGLIB有没有接口都可以用 为什么要用JDK动态代理 ​ 1⃣️JDK动态代理 创建对象的速度比 CGLB快 在单例模式下 但是CGLIB 效率性能高 对象多的话 频繁创建对象 用JDK

本文由作者按照 CC BY 4.0 进行授权

Redis📦

Springmvc🤖️