IOC ----控制反转
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
循环依赖就是循环引用,两个或以上的 bean
相互持有对方。比如说 beanA
引用 beanB
, beanB
引用 beanC
, beanC
引用 beanA
, 它们之间的引用关系构成一个环。
一、自依赖
二、直接依赖
三、间接依赖
容器先创建 A,发现依赖于 B,再创建 B,又发现依赖于 A … ,发生无限死循环,最后发生栈溢出错误,程序停止。
// 从上至下 分表代表这“三级缓存”
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //一级缓存
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 二级缓存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 三级缓存
singletonObjects:用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用,成品bean
earlySingletonObjects:提前曝光的单例对象的cache,存放原始的 bean 对象(尚未填充属性),半成品bean,用于解决循环依赖,
singletonFactories:单例对象工厂的cache,存放 bean 工厂对象,用于解决循环依赖。
AOP 为Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
权限管理、异常处理、操作日志、事务控制。
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强。
优势:减少重复代码,提高开发效率,并且便于维护。
实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中
根据应用程序的需求,选择适当的作用域可以管理Bean的生命周期、控制资源消耗和确保正确的状态管理。
通过在方法上添加@Transactional
注解,可以轻松实现Spring的事务管理,保证数据一致性和业务的完整性。
Spring的事务管理通过AOP和动态代理,将事务管理逻辑与业务逻辑解耦,使得开发者能够更加专注于业务实现,同时保证了事务的一致性和完整性。