spring采用构造注入的方式可能出现循环引用的问题。
例如类B 和类A相互引用
public class B {
private A a;
public B()
{
System.out.println("create b with no args");
}
public B(A a)
{
this.a=a;
System.out.println("creating b");
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public void print()
{
System.out.println("create b success");
}
}
类A
package cn.edu.cqupt.bean; public class A { private B b; A(B b) { this.b=b; System.out.println("creating a"); } public B getB() { return b; } public void setB(B b) { this.b = b; } public void print() { System.out.println("create a success"); } }
测试文件
package cn.edu.cqupt.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.cqupt.bean.A;
import cn.edu.cqupt.bean.B;
public class Test {
public static void main(String args[])
{
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
A a = (A)context.getBean("a");
B b =(B) context.getBean("b");
if(null!=b.getA())
System.out.println("not null");
a.print();
b.print();
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
<beans>
<bean id="b" class="cn.edu.cqupt.bean.B">
<property name="a" ref="a"></property>
</bean>
<bean id="a" class="cn.edu.cqupt.bean.A">
<constructor-arg ref="b" />
</bean>
</beans>
采用构造注入因调用构造方法时,参数为null,产生异常。
可将另外一个bean的注入方式修改为set注入,注意添加set方法。
另外,spring在容器中创建实例是按照配置文件顺寻的,即,如果上面两个bean的实例化顺序对调,先构造a,后构造b,依然会产生错误。。。至于set注入时可以拿到后面构造出的bean注入(即上面配置文件中,bean b的ref =“a”,个人感觉当发现ref=“a” a未实例化时,实例化a,然后继续实例化b)。以后有空了再研究源码- -找工作伤不起啊 - -!