spring
一、IOC与AOP了解吗?
- IOC实际上就是用来解决依赖与对象管理问题的
- 有着依赖注入与反转控制的描述,控制反转为将原本要手动new的对象交给IOC容器管理,依赖注入即是反转控制的实现方式,将依赖关系自动注入到需要它们的对象中
- IOC的好处在于可以方便单元测试、对象依赖等一系列操作,等于已经提供了完整的一套东西
- AOP实际上就是抽离非业务代码,达到解耦的目的。AOP的底层是动态代理,在spring内实现依赖的是beanPostProcessor,我理解的就是每当执行这个方法可以在执行这个方法的前后执行一个非业务代码
二、一般是怎么把对象交给IOC容器管理的(怎么定义bean的)?
- 注解:定义各种对象
- xml:责任链
- javaconfig:(注解解决不了的)
- 基于Groovy DSL配置
三、bean的生命周期管理是怎么样的?
- 扫描bean信息,采用beandefinition的实例来存储对象的信息(存储着对对象定义的元数据,例如@scope、@lazy等)
- 执行beanfactorypostprocesser的后置处理器的逻辑
- 查看是否有aware相关接口,有的话填充相关的资源
- 通过反射使用合适的构造器进行实例化
- 执行beanPostprocesser的before方法
- 随后执行init方法
- 执行beanPostprocesser的after方法
四、Spring的循环依赖怎么解决?
- @Lazy注解,这个注解的作用是延迟加载,只有真正用的时候,才会去真正的初始化。初始化B时,会直接创建一个代理对象,将代理对象注入到A中
- 三级缓存来解决循环依赖,对于setter注入造成的依赖是通过Spring容器提前暴露刚完成实例化但未完成初始化的bean来完成的,而且只能解决单例作用域的bean循环依赖。通过提前暴露一个单例工厂方法,从而使其他bean能引用到该bean
五、为什么是三级缓存?
- 三级缓存分别是哪些
- singletonObjects(一级,日常实际获取Bean的地方)
- earlySingletonObjects(二级,还没进行属性注入,由三级缓存放进来)
- singletonFactories(三级,Value是一个对象工厂)
- A依赖的对象B是有AOP的,若只有两层则需要存入二级之前要做AOP代理
- 所以设计对象工厂这样的第三级缓存,产生代理对象放入二级缓存