ssh入门学习札记之spring循环引用
ssh入门学习笔记之spring循环引用
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)。以后有空了再研究源码- -找工作伤不起啊 - -!