Spring
Spring IOC
IOC ----控制反转
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。
怎么理解控制反转
- 谁控制谁,控制什么 ?
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
- 为何是反转,哪些方面反转了 ?
有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
什么是循环依赖?
循环依赖就是循环引用,两个或以上的 bean
相互持有对方。比如说 beanA
引用 beanB
, beanB
引用 beanC
, beanC
引用 beanA
, 它们之间的引用关系构成一个环。
循环依赖的类型
一、自依赖
二、直接依赖
三、间接依赖
循环依赖要解决的问题
容器先创建 A,发现依赖于 B,再创建 A,又发现依赖于 B … ,发生无限死循环,最后发生栈溢出错误,程序停止。
三级缓存
三级缓存数据结构
// 从上至下 分表代表这“三级缓存”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
AOP概念
AOP 为Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
Spring AOP场景
权限管理、异常处理、操作日志、事务控制。
AOP的作用及其优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强。
优势:减少重复代码,提高开发效率,并且便于维护。
AOP 的底层实现
实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
Autowired和Resource的关系
相同点
两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中
不同点
- 来源不同:@Autowired是Spring提供的注解,而@Resource是JavaEE提供的注解。
- 注入方式不同:@Autowired默认按照类型(byType)进行装配,如果找到多个匹配类型,则会根据变量名或属性名进行匹配;而@Resource默认按照名称(byName)进行装配,如果找不到与名称完全匹配的bean,则会抛出异常。
- 支持范围不同:@Autowired只支持Spring容器中的bean自动装配;而@Resource可以同时使用在Spring容器和JavaEE容器中。
spring的作用域
- 单例(Singleton)作用域:在整个应用程序中只存在一个Bean实例,Spring容器负责创建并管理其生命周期。
- 原型(Prototype)作用域:每一次请求(将其注入到另一个bean中,或执行getBean()方法)都会产生一个新的bean实例,相当于new操作。
- 会话(Session)作用域:每个用户会话对应一个Bean实例,在用户会话期间保持。
- 请求(Request)作用域:每个HTTP请求对应一个Bean实例,并且仅在当前请求处理期间有效。
- 全局会话(Global Session)作用域:仅适用于基于Web的应用程序,类似于会话作用域,但仅在全局HTTP会话中有效。
- 线程(Thread)作用域:在同一线程上下文中共享Bean实例,适用于多线程环境。
根据应用程序的需求,选择适当的作用域可以管理Bean的生命周期、控制资源消耗和确保正确的状态管理。
spring事务怎么用?
通过在方法上添加@Transactional
注解,可以轻松实现Spring的事务管理,保证数据一致性和业务的完整性。
spring事务的原理?
Spring的事务管理通过AOP和动态代理,将事务管理逻辑与业务逻辑解耦,使得开发者能够更加专注于业务实现,同时保证了事务的一致性和完整性。
spring的事务传播级别
- REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。
- MANDATORY:必须存在一个当前的事务,否则将抛出异常。
- REQUIRES_NEW:创建一个新的事务,并挂起当前事务(如果存在)。
- NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则将其挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在嵌务中执行;如果没有事务,则创建一个新的事务。