`
kevin_in_java
  • 浏览: 30879 次
  • 性别: 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
分享到:
评论

相关推荐

    java学习笔记-html-ssh-js

    【Java学习笔记】 在Java的学习旅程中,深入理解其核心概念是至关重要的。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和稳定性而受到青睐。本笔记集合将带你逐步走进Java的世界,从基础语法到...

    java 学习笔记

    ### Java学习笔记知识点总结 #### 一、Java基础知识 (Basic Java & Core Java) - **基本概念**:介绍Java的历史背景、特点以及应用领域。 - **数据类型**:讲解Java中的基本数据类型(如int、double等)和引用数据...

    Java从入门到精通整理笔记

    ### Java从入门到精通知识点梳理 #### 一、Java基础知识 - **基本概念**: - Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年发布。 - Java具有简单性、面向对象、分布式、健壮性、安全性、平台...

    javademo的使用

    1. **基础语句**:Java的基础语句包括变量声明、赋值语句、条件语句(if-else)、循环语句(for、while、do-while)以及开关语句(switch)。这些语句是程序逻辑的基础,用于实现不同条件下的代码执行路径。 2. **...

    jbpm4文档集合

    2. **学习笔记**:学习笔记通常是对理论知识的实践总结,可能会包含作者在学习过程中遇到的问题及解决方法,对理解jbpm4的实际操作有极大帮助。这些笔记可能涉及流程实例的创建、参与者管理、流程变量的使用等。 3....

    Java_笔记整理

    - **基础知识**:包括变量、数据类型、流程控制(if、switch、循环等)、数组、字符串等。 - **面向对象编程(OOP)**:类与对象的概念、封装、继承、多态。 - **异常处理**:了解try-catch-finally块的使用,以及...

    cis106:这是我2021年Spring学期Linux课程的回购

    在这个压缩包文件“cis106-main”中,我们可以期待找到与Linux系统相关的各种学习资源,如讲义、笔记、练习题、实验指导和可能的项目代码等。 Linux是一个开源的类UNIX操作系统,它被广泛应用于服务器、嵌入式设备...

Global site tag (gtag.js) - Google Analytics