spring中循环依赖问题、Servlet 的过滤器与 Spring 拦截器区别

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中循环依赖问题、Servlet 的过滤器与 Spring 拦截器区别_第1张图片

解决方式: 

首先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 拦截器区别 

 spring中循环依赖问题、Servlet 的过滤器与 Spring 拦截器区别_第2张图片

 Filter过滤器在请求进入容器后,在进入Servlet之前进行预处理,需要服务器控制。

Intercept拦截器是在请求进入Servlet后,在进入Controller之前进行预处理,Controller中渲染了对应的视图之后的请求结果。

你可能感兴趣的:(spring,java,后端)