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

发布时间:2024年01月24日

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中渲染了对应的视图之后的请求结果。

文章来源:https://blog.csdn.net/weixin_63541561/article/details/135814848
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。