目录
48.ApplicationContext和BeanFactory有什么区别
50.Spring中什么时候@Transactional会失效
41.谈谈你对AQS的理解,AQS如何实现可重⼊锁?
1.
AQS是⼀个JAVA线程同步的框架。是JDK中很多锁⼯具的核⼼实现框架。
2.
在AQS中,维护了⼀个信号量state和⼀个线程组成的双向链表队列。其中,这个线程队列,就是⽤ 来给线程排队的,⽽state就像是⼀个红绿灯,⽤来控制线程排队或者放⾏的。 在不同的场景下,有不⽤的意义。
3.
在可重⼊锁这个场景下,state就⽤来表示加锁的次数。0标识⽆锁,每加⼀次锁,state就加1。释放锁state就减1。
42.谈谈你对IOC的理解
- 提到Spring 我们都能想到核心是,IOC和AOP
- 那么我就谈一谈IOC的理解,说到IOC就要想到他的核心就是控制反转。
- 对于我来说,控制反转就是把对于成员变量赋值的控制权,从代码中反转(转移)Spring工厂和配置文件中完成,他的好处就是解耦合,底层实现是工厂设计模式。
43.单例Bean和单例模式
- 单例模式表示JVM中某个类的对象只会存在唯⼀⼀个。
- ⽽单例Bean并不表示JVM中只能存在唯⼀的某个类的Bean对象。
44.Spring事务传播机制
- 多个事务⽅法相互调⽤时,事务如何在这些⽅法间传播,⽅法A是⼀个事务的⽅法,⽅法A执⾏过程中调 ⽤了⽅法B,那么⽅法B有⽆事务以及⽅法B对事务的要求不同都会对⽅法A的事务具体执⾏造成影响, 同时⽅法A的事务对⽅法B的事务执⾏也有影响,这种影响具体是什么就由两个⽅法所定义的事务传播类型所决定。
- REQUIRED(Spring中默认的传播类型): 如果a有事务,那么b就加入, 如果a没有事务,b就创建一个事务执行。
- SUPPORT: 如果a有事务,b就加入,如果a没有事务,那么b也没有必要有事务
- MANDATORY:如果a有事务,b就加入,没有事务,就抛出异常
- REQUIRES_NEW: 如果a有事务,b暂时挂起,互不影响,各自执行
- NOT_SUPPORTS:如果a有事务,则挂起事务,以非事务方式
- NEVER:不使用事务,如果有事务就抛出异常
- NESTED:如果当前有事务存在,就嵌套执行,跟REQUIRED一样。
45.Spring事务什么时候会失效?
Spring的事务其实就是Aop,进行了切面增强,如果事务失效就说明Aop动态代理失效。
- 发生自身调用,类方法调用本类的this方法(this通常省略),动态代理就会失效
- 数据库不支持事务
- 有异常被吃掉,事务没有回滚
- 没有被spring容器管理
- @Transactional 注解需要在public方法上面,如果不是public修饰,导致事务失效
46.Spring中的Bean创建的⽣命周期有哪些步骤
实例化:
- 通过推断构造方法(反射)
- 实例工厂、静态工厂
属性注入:
- 解析自动装配(@Autowried,byname,bytype,@Resource,@constractor),DI
- 循环依赖
初始化:
- 实现不同的XXXAware的回调方法
- 调用初始化生命周期回调(实现init().@PostConstruct,实现InitializingBean接口)
- 如bean实现Aop,创建动态代理
销毁:
- Spring容器关闭时回调
- 调用摧毁时回调
更加细致的流程图:
47.Spring中Bean是线程安全的吗
Spring本身并没有针对Bean做线程安全的处理,所以:
- 如果Bean是⽆状态的,那么Bean则是线程安全的
- 如果Bean是有状态的,那么Bean则不是线程安全的
- 另外,Bean是不是线程安全,跟Bean的作⽤域没有关系,Bean的作⽤域只是表示Bean的⽣命周期范 围,对于任何⽣命周期的Bean都是⼀个对象,这个对象是不是线程安全的,还是得看这个Bean对象本身。