1、spring中事务的传播特性
事务传播特性,就是多个事务方法调用时如何定义方法间事务的传播。Spring 定义了 7 种传播行为:
propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
2、FactoryBean 与 BeanFactory 有什么区别?
BeanFactory是个Factory,也就是IOC容器或对象⼯⼚,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进⾏管理的。但对FactoryBean⽽⾔,这个Bean不是简单的Bean,⽽是⼀个能⽣产或者修饰对象⽣成的⼯⼚Bean
BeanFactory 是 IoC 底层容器,提供了 bean 的管理
FactoryBean 是创建 Bean 的一种方式,帮助实现复杂的初始化逻辑
3、介绍一下 Spring bean 的生命周期
1.实例化Bean,反射的方式生成对象
2.填充bena的属性:populateBean(),循环依赖的问题(三级缓存)
3.调用aware接口相关的方法:invokeAwareMethod(完成BeanName可以获取容器bean的名称,BeanFactory获取当前bean factory这也可以调用容器的服务,BeanClassLoader对象的属性设置)
4.调用BeanPostProcessor中的前置处理方法:使用比较多的有(ApplicationContextPostProcessor设置ApplicationContext,Environment,ResourceLoader,EmbeddValueResolver等对象)
5.调用initmethod方法:invokeInitmethod(),判断是否实现了InitializingBean接口,如果有,调用afterPropertiesSet方法,
6.调用BeanPostProcessor的后置处理方法:spring的aop就是在此处实现的,AbstractAutoProxyCreator
注册Destuction相关的回调接口
7.获取到完整的对象,可以通过getBean的方式来进行对象的获取
8.销毁流程 ①判断是否实现了DispoableBean接口②调用destroyMethod方法
Spring bean的生命周期只有四个主要阶段,其他都是在这四个主要阶段前后的扩展点,这四个阶段是:
1.实例化 Instantiation
2.属性赋值 Populate
3.初始化 Initialization
4.销毁 Destruction
4、三级缓存
什么是三级缓存,其实就是Spring中在实例化的时候定义了三个不同的Map,如果我们要解决循环依赖,其核心就是提前拿到提前暴露的对象,尽管它还没有初始化。
一级缓存,用于存放完全初始化好的 Bean
二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行初始化方法
三级缓存,单例Bean工厂,二级缓存中存储的就是从这个工厂中获取到的对象
5、Spring 如何解决 bean 的循环依赖?
A 实例化时依赖 B,于是 A 先放入三级缓存,然后去实例化 B;
B 进行实例化,把自己放到三级缓存中,然后发现又依赖于 A,于是先去查找缓存,但一级二级都没有,在三级缓存中找到了。
然后把三级缓存里面的 A 放到二级缓存,然后删除三级缓存中的 A;
然后 B 注入半成品的实例 A 完成实例化,并放到一级缓存中;
然后回到 A,因为 B 已经实例化完成并存在于一级缓存中,所以直接从一级缓存中拿取,然后注入B,完成实例化,再将自己添加到一级缓存中。
6、Spring 框架用到了哪些设计模式?
工厂模式:Spring 使用工厂模式,通过 BeanFactory 来创建对象
单例模式:Bean 默认就是单例模式
策略模式:Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码提升
模板方法模式:父类生成代码骨架,具体实现延迟到子类,如 JdbcTemplate、RestTemplate
适配器模式:Spring AOP 中的 Advice 使用到了适配器模式,Spring MVC 中用到了适配器模式适配 Controller
观察者模式:Spring 事件驱动模型就是观察者模式