`
kevin_in_java
  • 浏览: 29451 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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)。以后有空了再研究源码- -找工作伤不起啊 - -!

0
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics