spring中的循环依赖问题
当A类中关联B,B类中关联A
class A {B b;
}
class B {A a;
}
正常java代码中new A时,b为null;new B时,a为null;
但是在spring中,由于对象是由spring容器管理的,当创建A 的bean对象时,B的bean还没有创建,无法将B注入到A中,同理,当创建B的bean对象时,A的bean 对象也没有创建,无法将A出入到B中,两者都不能完成创建,造成了循环依赖问题。
解决方式:
首先spring中有三级缓存:
1.一级缓存(singletonObjects):创建的bean对象;用于保存实例化、注入、初始化完成的bean实例。
2.二级缓存(earlySingletonObjects):半成品的bean对象;用于保存实例化完成的bean实力,提前暴露对象。
3.三级缓存(singletonFactories):创建bean对象的工厂。
循环依赖创建过程:
1.创建并初始化A
2.发现B未创建bean对象,将A的半成品bean对象存到二级缓存中,工厂放入三级缓存中。
3.创建B并初始化的bean对象,在二级缓存中拿A的半成品注入。
4.bean B初始化完成,放到一级缓存。
5.完成A的bean对象创建,将B的bean对象注入到A中。
Servlet 的过滤器与 Spring 拦截器区别
Filter过滤器在请求进入容器后,在进入Servlet之前进行预处理,需要服务器控制。
Intercept拦截器是在请求进入Servlet后,在进入Controller之前进行预处理,Controller中渲染了对应的视图之后的请求结果。