读过Spring源码的同志请留步,问个问题。-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

读过Spring源码的同志请留步,问个问题。

2016-03-16 13:39:20 1865 1

AbstractBeanFactory这个类的doGetBean是进行bean依赖的注入并返回填充好的bean实例,请问一下

final RootBeanDefinition mbd =getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
//Guarantee initialization of beans that the current bean depends on.
String[] dependsOn = mbd.getDependsOn();
 if (dependsOn != null) {
    for (int i = 0; i < dependsOn.length; i++) {
    String dependsOnBean = dependsOn[i];
        //这里有个回调函数
    getBean(dependsOnBean); 
        //注册依赖注入bean
        registerDependentBean(dependsOnBean, beanName);
    }
}

这个是依赖bean的注入部分代码,回调函数一直看不懂为什么这样做,而且最近想设计一个IOC但是由于出现一个问题让我很费神,问题描述如下:

UserService 中有accountService(AccountService)的引用,而AccountService中有userService(UserService)的引用,属于循环引用,这个在该类中也说明不允许存在循环依赖,但是其实我们用Spring时可以这样注入,如果不看这个细节,那么上面的A依赖B,B依赖A的情况如何去考虑和实现呢?求思路、方法!!!!

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:03:50
    class A{
        B b;
    }
     
    class B{
         
        A a;
    }
     
    class FactoryBean{
         
        Map<String, Object> beanMap = new HashMap<String, Object>();
        public Object getBean(){
            A a = new A();
            B b = new B();
            try {
     
            Field f1 = b.getClass().getDeclaredField("a");
            f1.setAccessible(true);
            f1.set(b, a);
             
            Field f = a.getClass().getDeclaredField("b");
            f.setAccessible(true);
            f.set(a,b);
                 
            f1.set(b, a);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return a;
        }
    }
         
    public class Test1 {
        public static void main(String[] args) {
            A a = (A)new FactoryBean().getBean();
            System.out.println("-------");
            System.out.println(a.b);
            System.out.println(a.b.a+"="+a);
        }
    }

    在反射设置属性时这里是模仿spring的构建bean的情况,A经过初始化后spring检查下面是否有引用如果有引用则进行预先初始化A中的引用依赖,就是B b = new B();但是B需要a的实例,所以直接将A a=new A();中的a设置进去,当然这里的a经过实例化后成员变量a.b是null,然后再设置a中应用的b,此时B中的a是不完整的,然而最后一句f1.set(b, a);再补充设置b中的a,就完整了。运行结果如下:
    System.out.println("-------");

    System.out.println(a.b+"="+a.b.a.b);

    System.out.println(a.b.a+"="+a);

    com.ins.base.test.B@ca0b6=com.ins.base.test.B@ca0b6

    com.ins.base.test.A@10b30a7=com.ins.base.test.A@10b30a7

    说明引用是完整的,不知道这样理解和分析是否正确,请确认下咯。

    0 0
相关问答

1

回答

[@倚贤][¥20]spring源码该如何学习?

2018-12-03 23:42:00 1631浏览量 回答数 1

1

回答

如何借助Spring Boot 2.5 运维MySQL?

2021-12-23 17:04:29 413浏览量 回答数 1

1

回答

Java Spring Boot 2.0 安全机制都有哪些?

2021-12-23 17:14:54 304浏览量 回答数 1

1

回答

Spring Boot 2.4 可以用什么工具开发?

2021-12-23 16:55:52 396浏览量 回答数 1

1

回答

Spring Boot 开发环境准备都包括什么?

2021-12-23 16:56:22 352浏览量 回答数 1

1

回答

Spring Boot 2.5 实战开发 REST API,如何模拟淘宝订单接口?

2021-12-23 16:57:32 487浏览量 回答数 1

1

回答

Java Spring Boot 2.x 启动过程是什么?

2021-12-23 17:01:33 394浏览量 回答数 1

1

回答

Spring Boot 2.0 监控如何自动化配置 Bean?

2021-12-23 17:02:02 389浏览量 回答数 1

1

回答

SpringBoot自动配置的原理是什么?

2021-11-04 21:31:00 160浏览量 回答数 1

1

回答

Spring boot接收json格式参数的问题? 400 报错

2020-06-04 13:16:31 1022浏览量 回答数 1
+关注
文章
问答
问答排行榜
最热
最新
相关电子书
更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧
立即下载
打赢企业信息安全这场仗
立即下载
电商网站需求分析和架构设计Spring Boot2.6入门
立即下载