spring ioc的理解,原理及实现
- 控制反转:对象由spring来控制,例如 DI : 依赖注入,常见 @Autowired
- 容器: 使用map结构来存储,spring一般存在三级缓存。bean的生命周期,从创建到使用,到销毁,全部由容器来管理
- bean的生命周期:bean 的生成主要使用到工厂模式加反射。创建benafactory ,读取bena配置到beanDefinition,(xml的读取,注解的检测),bean工厂的扩展,bean属性的丰富,生成bean ,销毁bean。
spring 三级缓存是哪三级
- singletonObjects,核心的单例bean缓存
- earlySingletonObjects, 提前暴露的单例对象,如@PostConstruct注解的方法或实现了InitializingBean接口的afterPropertiesSet方法
- singletonFactories 用于存储beanfactory,如果有其他Bean依赖于当前正在创建的Bean,而当前Bean还没有完全初始化,那么可以通过这个缓存中的ObjectFactory来创建一个代理对象,以满足依赖关系,从而避免循环依赖问题。
spring 是如何解决循环依赖
三级缓存, 提前暴露, aop
- 互相依赖,构成循环依赖
- 实例化和初始化分开操作(提前暴露对象的引用),不同状态的对象放在不同级别的缓存中,一级缓存放的是完整的对象,二级缓存放的是实例化但未初始化完成的的对象,三级缓存是一个函数式接口,创建代理对象
- bean的创建优先放在三级缓存中,需要代理(aop)返回代理对象,否则返回普通对象