1.IOC容器构建流程
1.获取一个新的bean工厂,通常是ApplicationContext
2.加载和解析spring的配置文件,解析bean对象,封装为beanDefinition对象,放在本地缓存中
3.对象实例化和初始化bean对象
5.完成容器的构建
2.spring中bean的生命周期
简单来说:
实例化:实现方法createBeanInstance()
属性赋值:实现方法populateBean()
初始化:使用方法initializeBean()
使用
销毁
3.关于AOP
对原有类或接口进行增强,实现原理是动态代理:
具体实现方式参考以下文章:
动态代理之JDK动态代理的实现
动态代理之CGLIB动态代理的实现
4.Spring 的事务隔离级别
默认:使用数据库隔离级别
读未提交:最低隔离级别,可以读取到其他事物未提及的内容
读已提交:读取到的内容都是已提交的
可重复读:在一个事物中可以重复读取相同的内容
串行化:最高隔离级别,读写都会加锁
5.循环依赖问题
什么是循环依赖:
两个对象互相引用
解决方式:
三级缓存
举个例子:
A依赖了B,B也依赖了A,那么依赖注入过程如下。
1.检查 A 是否在缓存中,发现不存在,进行实例化
2.通过构造函数创建 bean A,并通过 ObjectFactory 提前曝光 bean A
3.A 走到属性填充阶段,发现依赖了 B,所以开始实例化 B。
4.首先检查 B 是否在缓存中,发现不存在,进行实例化
5.通过构造函数创建 bean B,并通过 ObjectFactory 曝光创建的 bean B
6.B 走到属性填充阶段,发现依赖了 A,所以开始实例化 A。
7.检查 A 是否在缓存中,发现存在,拿到 A 对应的ObjectFactory 来获得 bean A,并返回。
8.B 继续接下来的流程,直至创建完毕,然后返回 A 的创建流程,A 同样继续接下来的流程,直至创建完毕
6.@Resource 和 @Autowire
都是用来装配bean
@autowire默认按类型装配,默认情况下依赖对象必须存在
@Resource如果指定了name和type,则按指定装配,如果不知道,怎优先按名称进行装配
@autowire可以配合配合 @Qualifier 实现按名称装配