spring如何解决循环依赖的

原创
2019/12/26 10:54
阅读数 11

1、spring无法解决构造函数造成的循环依赖

spring容器初始化的时候,会将所有的bean(带有@Service等等注解)存入到容器,然后循环遍历容器中所有的bean,看bean里面的属性是否带有@Autowired注解,如果带有此注解的话,就将bean属性的值,从容器里面取出对象设置进去。

public class A {
    private B b;
    public A(){
        System.out.println("实例化A");
    }
    public void test(){
        System.out.println("打印B:"+b);
    }
}
public class B {
    private A a;
    public B(){
        System.out.println("实例化B");
    }
    public void test(){
        System.out.println("打印A:"+a);
    }
}
public class Test {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        // 通过反射创建对象,并放入缓存
        Map<String,Object> map = new HashMap<>();
        map.put("a",Class.forName("test.循环依赖.A").newInstance());
        map.put("b",Class.forName("test.循环依赖.B").newInstance());
        // 以此注入参数值
        for (Map.Entry<String, Object> entries:map.entrySet()) {
            for (Field field:entries.getValue().getClass().getDeclaredFields()) {
                // 暴力反射
                field.setAccessible(true);
                String fieldName = field.getName();
                Object o = map.get(fieldName);
                // 注入属性
                field.set(entries.getValue(),o);
            }
        }
        // 检查是否注入成功
        A a = (A)map.get("a");
        a.test();
        B b = (B)map.get("b");
        b.test();
        System.out.println("end");
    }
}

打印结果:

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部