Spring框架中的单例Bean是线程安全的吗?
Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。
有状态就是有数据存储功能,无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。
Dao会操作数据库Connection,Connection是带有状态的,比如说数据库事务,Spring的事务管理器使用Threadlocal为不同线程维护了一套独立的connection副本,保证线程之间不会互相影响,不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用ThreadLocal把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized、lock、CAS等这些实现线程同步的方法了。
Spring事务的实现方式和原理以及隔离级别
数据库的配置隔离级别是Read Commited,而Spring配置的隔离级别是Repeatable Read,请问这时隔离级别是以哪一个为准?
以Spring配置的为准,如果spring设置的隔离级别数据库不支持,效果取决于数据库
Spring事务传播机制
Spring事务失效场景
参考文章链接:美团二面:spring事务不生效的15种场景 - 掘金 (juejin.cn)
Spring AOP理解
Spring 生命周期
参考文章链接:Spring Bean的生命周期解读-CSDN博客
Spring中ApplicationContext和BeanFactory的区别
Spring是如何解决循环依赖的
1. 三级缓存 参考文章链接 Spring Bean生命周期源码篇-CSDN博客
2. @Lazy
@Lazy
是 Spring 框架中的一个注解,用于告诉Spring 延迟初始化一个 bean,即只有在需要时才创建 bean 实例。在出现循环依赖的时候,添加@Lazy注解注入的Bean属性,其实是为该Bean创建一个代理对象。
SpringMvc理解
参考文章链接 手写模拟SpringMvc源码_基于配置文件的springmvc应用--模拟开发登录功能源码-CSDN博客