介绍一下spring bean的生命周期
1.加载配置转化成spring bean的定义。
2.使用jdk动态代理根据bean的定义创建bean的实例并封装成beanwrapper。
3.执行populateBean()属性填充方法。
4.执行initializeBean()方法进行bean的初始化,在初始化中,如果 Bean 实现了 BeanNameAware 接⼝,调⽤ setBeanName() ⽅法,传⼊Bean的名字。如果 Bean 实现了 BeanClassLoaderAware 接⼝,调⽤ setBeanClassLoader() ⽅法,传⼊ClassLoader 对象的实例。如果Bean实现了BeanFactoryAware接口调用setBeanFactory方法传入AbstractAutowireCapableBeanFactory对象实例信息。
如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执⾏ postProcessBeforeInitialization() ⽅法
如果实现了InitializingBean接口,这执行afterPropertiesSet()方法。
如果 Bean 在配置⽂件中的定义包含 init-method 属性,执⾏指定的⽅法。
如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执⾏ postProcessAfterInitialization() ⽅法
5.最后执行registerDisposableBeanIfNecessarybean的销毁逻辑,当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接⼝,执⾏ destroy() ⽅法。当要销毁 Bean 的时候,如果 Bean 在配置⽂件中的定义包含 destroy-method 属性,执⾏指定的⽅法。
介绍一下spring的三级缓存
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
// ....
/** 单例对象缓存:k:beanName, v: 实例。一级缓存 */
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
/** 单例工厂缓存:k:beanName, v: ObjectFactory 三级缓存*/
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
/** 早期单例对象缓存:k:beanName, v: 实例 */
/** Cache of early singleton objects: bean name to bean instance. 二级缓存*/
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
// ....
}
创建对象的时候先看看一级缓存中有没有,如果没有再走二级缓存,如果二级缓存中没有,再走三级缓存。
说一下spring怎样利用三级缓存解决循环依赖
1.也就是说第一次会创建出来a对象,但是a对象中的b属性值为null(半成品),然后会将key为a,value为lambda表达式放入到三级缓存中。
然后进行populateBean方法中进行属性填充,说白了就是开始创建B对象。
2.会创建出来b对象,但是b对象中的a属性值为null(半成品)。然后会将key为b,value为lambda表达式放入到三级缓存中。
然后进行populateBean方法中进行属性填充,说白了给b对象中的a属性进行复制。
3.这个时候会走到我们的lambda表达式中,我们之前创建好的半成品的a对象进行返回。同时将三级缓存中的a对象移除掉,将其放入到二级缓存中(说白了二级缓存中放的是一个半成品对象key:a,value:b属性为null)。
这个时候b对象就是一个完整的成品对象了。
4.将完整的成品的b对象放入到一级缓存中,同时将它从三级缓存中移除。
5.然后将半成品中的a对象的b属性进行赋值。这个时候a也成为了成品对象了。
6.最后将成品的a对象放到一级缓存中,将二级缓存中的a对象进行移除。
说一下aop动态代理的原理
aop增强逻辑的执行时机是在initializeBean方法中,更确切一点说是在BeanPostProcessor的后置处理方法中执行。
其实底层为目标 bean 查找合适的通知器,并封装成一个排好顺序的List