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)。以后有空了再研究源码- -找工作伤不起啊 - -!
分享到:
相关推荐
【Java学习笔记】 在Java的学习旅程中,深入理解其核心概念是至关重要的。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和稳定性而受到青睐。本笔记集合将带你逐步走进Java的世界,从基础语法到...
### Java学习笔记知识点总结 #### 一、Java基础知识 (Basic Java & Core Java) - **基本概念**:介绍Java的历史背景、特点以及应用领域。 - **数据类型**:讲解Java中的基本数据类型(如int、double等)和引用数据...
### Java从入门到精通知识点梳理 #### 一、Java基础知识 - **基本概念**: - Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年发布。 - Java具有简单性、面向对象、分布式、健壮性、安全性、平台...
1. **基础语句**:Java的基础语句包括变量声明、赋值语句、条件语句(if-else)、循环语句(for、while、do-while)以及开关语句(switch)。这些语句是程序逻辑的基础,用于实现不同条件下的代码执行路径。 2. **...
2. **学习笔记**:学习笔记通常是对理论知识的实践总结,可能会包含作者在学习过程中遇到的问题及解决方法,对理解jbpm4的实际操作有极大帮助。这些笔记可能涉及流程实例的创建、参与者管理、流程变量的使用等。 3....
- **基础知识**:包括变量、数据类型、流程控制(if、switch、循环等)、数组、字符串等。 - **面向对象编程(OOP)**:类与对象的概念、封装、继承、多态。 - **异常处理**:了解try-catch-finally块的使用,以及...
在这个压缩包文件“cis106-main”中,我们可以期待找到与Linux系统相关的各种学习资源,如讲义、笔记、练习题、实验指导和可能的项目代码等。 Linux是一个开源的类UNIX操作系统,它被广泛应用于服务器、嵌入式设备...