Spring bean ,AOP,spring事务

Spring的单例bean是线程安全的吗?

分情况,一般来说是线程安全的,像平常用的service,mapper这种无状态的bean。

有状态的单例bean是线程不安全的,比如AService里,有一个公共变量a,op方法可以操作a,多线程并发时a会出现线程安全问题。

什么是AOP

AOP(Aspect Oriented Programming,面向切面编程),在传统的面向对象编程中,横切关注点通常是那些分散在整个应用程序中的功能,如日志记录、事务管理、安全检查等。

Spring中的声明式事务就是通过AOP实现的,表现为在方法执行前开启事务,在方法结束后回滚或者提交事务

Spring中事务失效的场景
  • 异常捕获后没抛出,导致事务失效。
  • 抛出检查异常,使用@Rollbackfor(Exception.class)
  • 注解在非public方法上
  • 同类中的事务方法调用
  • 异步事务,在当前事务中异步新开启线程调用另一个事务方法时,异步方法报错不影响当前事务,原因:事务是根据数据库连接来的,新的线程实际新建立了一个数据库连接,两个连接不同导致不是同一事务
Spring中事务的传播机制
  • REQUIRED:支持当前事务,如果不存在,则创建一个新事务。
  • SUPPORTS:支持当前事务,如果不存在,则非事务执行。
  • MANDATORY:支持当前事务,如果不存在,则抛出异常。
  • REQUIRES_NEW:创建一个新事务,如果存在,则暂停当前事务。
  • NOT_SUPPORTED:非事务性执行,如果存在当前事务,则暂停当前事务。
  • NEVER:非事务性执行,如果存在事务,则抛出异常。
  • NESTED:如果当前事务存在,则在嵌套事务中执行,否则行为类似于REQUIRED。外部事务会影响内部事务,而内部不会影响外部事务
Spring bean的生命周期
Spring bean的循环依赖

循环依赖指的是两个或多个 Bean 相互依赖对方的情况。这样的依赖关系在单例(Singleton)作用域下可能会引发问题,因为 Spring 需要在某个时刻创建这些 Bean,并且在创建过程中需要解决相互引用的问题。

Spring如何解决循环依赖的:

- 一级缓存(Singleton Cache):这是 Spring 的 Singleton Bean 的存储位置。当一个 Bean 被创建时,它会被存储在这个缓存中。
- 二级缓存(Early Singleton Cache):这是 Spring 在创建 Bean 过程中的中间状态存储。当一个 Bean 正在创建过程中,它的部分属性已经被填充,但是还没有完全初始化完成。这时候,Spring 会将这个半初始化的 Bean 存储在这个缓存中。这样,在创建过程中如果其他 Bean 请求这个尚未完全初始化的 Bean,Spring 就可以从这个缓存中返回一个“部分初始化”的 Bean 实例。
- 三级缓存(Factory Method Cache):这是 Spring 在创建 Bean 实例之前的缓存,它存储的是 Bean 的工厂方法。当一个 Bean 正在创建时,Spring 会记录下创建这个 Bean 的工厂方法,以便在创建过程中可以继续使用这个方法来创建 Bean 的实例。这个缓存主要用于避免多次调用相同的工厂方法来创建相同的 Bean 实例。

三级缓存机制主要是为了优化 Spring 容器的性能,而不是专门用来解决循环依赖问题的。

不过单例作用域下的循环依赖:在单例作用域下,Spring 可以通过二级缓存解决大部分循环依赖问题。

原型(Prototype)作用域下,每次请求都会创建一个新的 Bean 实例。因此,如果在原型作用域下存在循环依赖,那么每次请求都会尝试创建这些相互依赖的 Bean,这会导致无限递归,并最终导致栈溢出错误(StackOverflowError)。

在相互依赖,使用构造方法注入时,可以使用@Lazy注解来解决循环依赖问题

jdk动态代理和cglib动态代理

JDK 动态代理是由 Java 开发工具包(JDK)提供的动态生成代理类的能力。这种代理机制主要用于实现 AOP(面向切面编程)功能,比如在方法调用前后添加额外的操作(如日志记录、权限检查等)。JDK 动态代理只能代理实现了接口的类,无法代理抽象类或最终类。

CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它可以用来生成不可见的子类来实现代理逻辑。CGLIB 动态代理可以代理任何类,无论它们是否实现了接口。

CGLIB与JDK相比,灵活度更好,性能开销较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值