- IOC的理解(what why how)?Spring如何解决循环依赖问题?
what
控制反转,依赖注入。
在Ioc场景中,所有的被注入对象和依赖对象由IoC Service Provider统一管理。IoC Service Probider会把相应的被依赖对象注入到被注入对象中。
why
每次使用依赖对象不需要主动获取,更加轻松简洁。
how
@Resource和@Autowired都是做bean的注入时使用。工厂模式加反射
Spring如何解决循环依赖问题:
第一级缓存〈也叫单例池)singletonObjects:存放已经经历了完整生命周期的Bean对象
第二级缓存: earlySingletonObjects,存放早期暴露出来的Bean对象,Bean的生命周期未结束(属性还未填充完整)
第三级缓存: Map<String, ObiectFactory<?>> singletonFactories,存放可以生成Bean的工厂
A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的AB顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。
- AOP的理解(what why how)?
what
通过横向抽取机制为无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。
why
难以消除重复性横切代码。
how
Spring AOP底层通过JDK或CGLib动态代理技术为目标Bean织入横切逻辑。
jdk动态代理
Proxy和InvocationHandler
cglib的动态代理
intercept(Object obj,Method method,Object[] args,MethodProxy proxy)