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的情况如何去考虑和实现呢?求思路、方法!!!!
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
说明引用是完整的,不知道这样理解和分析是否正确,请确认下咯。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。