您的位置:首页 > 编程语言 > Java开发

Spring中的IoC(控制反转)容器初探

2007-06-17 17:25 495 查看
IoC,翻译成中文有人叫控制反转,听起来很别别扭,其实就是依赖关系的转移,通过XML配置文件由容器来管理类,而不是在类中直接生成Bean的实例。
下面通过一个Hello World的实例来了解一下最基础的IoC
首先MyEclipse5.5新建一个Java工程,工程名上单击右键添加Spring容器能力。
我们先编写一个HelloWorld类
qiudawei115.base.HelloWorld.java
package qiudawei115.base;

public class HelloWorld {
String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}
注意这只是一个简单的Bean,没有任何其他东西。
在applicationContext.xml配置qiudawei115.base.HelloWorld(红色字体)
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="helloWorld" class="qiudawei115.base.HelloWorld">
<property name="message" value="Hello World!"></property>
</bean>
</beans>
现在写一个测试类,检验一下qiudawei115.base.HelloWorldMain.java
package qiudawei115.base;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class HelloWorldMain {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//读取配置文件
ClassPathResource resource=new ClassPathResource("applicationContext.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
//获取HelloWorld实例
HelloWorld helloWorld=(HelloWorld)beanFactory.getBean("helloWorld");
System.out.print(helloWorld.getMessage());
}
}
这样就完成了一个简单的IoC实例。
这里我们的Bean是由xml文件去管理的,我们索要做的就是从xml中获取这个类的实例。

依赖注入(DI)
IoC的重要功能之一就是进行Bean的管理,维护Bean之间的关联关系,这些工作是通过依赖注入(DI)来实现的(我对依赖注入有个解释就是根据Bean之间的依赖关系来实现向父Bean中注入子Bean,个人看法,不具权威,接受批评)。
依赖注入主要有两种方法,就是Constructor注入和Setter注入。
下面将分别介绍这两种注入。
Constructor注入通过带有参数的构造函数(构造器)实现,每个参数代表该对象的依赖Bean。还是看一个简单的例子。
qiudawei115.constructor.FirstBean.java
package qiudawei115.constructor;

public class FirstBean {
String message="I am FirstBean!";

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return this.message;
}
}

qiudawei115.constructor. SecondBean.java
package qiudawei115.constructor;

public class SecondBean {
String message="I an SecondBean!";

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return this.message;
}

}
qiudawei115.constructor.ConstructorBean.java
package qiudawei115.constructor;

public class ConstructorBean {
FirstBean fb;
SecondBean sb;
public ConstructorBean(FirstBean fb, SecondBean sb) {
super();
this.fb = fb;
this.sb = sb;
}

public void display(){
System.out.println("Constructor注入结果如下");
System.out.println(fb);
System.out.println(sb);
}

}
在applicationContext.xml增加对着三个类的管理(红色字体)

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="helloWorld" class="qiudawei115.base.HelloWorld">
<property name="message" value="Hello World!"></property>
</bean>
<bean id="fb" class="qiudawei115.constructor.FirstBean"></bean>
<bean id="sb" class="qiudawei115.constructor.SecondBean"></bean>
<bean id="cb" class="qiudawei115.constructor.ConstructorBean">
<constructor-arg>
<ref bean="fb"/>
</constructor-arg>
<constructor-arg>
<ref bean="sb"/>
</constructor-arg>
</bean>
</beans>
测试类:
qiudawei115.constructor.ConstructorMain.java
package qiudawei115.constructor;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class ConstructorMain {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathResource resource=new ClassPathResource("applicationContext.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
ConstructorBean cb=(ConstructorBean)beanFactory.getBean("cb");
cb.display();
}
}
至此,我们就完成了一个Constructor注入的简单实例,是不是很简单!
下面看看Setter注入的实例,在Setter注入中,首先要利用空构造函数构造一个Bean,然后利用该Bean的Setter方法完成Bean的注入就OK了。
我们继续通过一个简单的例子来进行了解。
qiudawei115.setter.FirstBean.java
package qiudawei115.setter;

public class FirstBean {
String message="I am FirstBean!";

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return this.message;
}
}
qiudawei115.setter.SecondBean.java
package qiudawei115.setter;

public class SecondBean {
String message="I an SecondBean!";

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return this.message;
}

}

qiudawei115.setter.SetterBean
package qiudawei115.setter;

public class SetterBean {
FirstBean sfb;

SecondBean ssb;

public FirstBean getSfb() {
return sfb;
}

public void setSfb(FirstBean sfb) {
this.sfb = sfb;
}

public SecondBean getSsb() {
return ssb;
}

public void setSsb(SecondBean ssb) {
this.ssb = ssb;
}

public SetterBean() {
super();
// TODO Auto-generated constructor stub
}

public void display(){
System.out.println("Setter注入结果如下");
System.out.println(sfb);
System.out.println(ssb);
}
}
配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- Hello World! -->
<bean id="helloWorld" class="qiudawei115.base.HelloWorld">
<property name="message" value="Hello World!"></property>
</bean>
<!-- Constructor DI -->
<bean id="fb" class="qiudawei115.constructor.FirstBean"></bean>
<bean id="sb" class="qiudawei115.constructor.SecondBean"></bean>
<bean id="cb" class="qiudawei115.constructor.ConstructorBean">
<constructor-arg>
<ref bean="fb"/>
</constructor-arg>
<constructor-arg>
<ref bean="sb"/>
</constructor-arg>
</bean>
<!-- Setter DI -->
<bean id="sfb" class="qiudawei115.setter.FirstBean"></bean>
<bean id="ssb" class="qiudawei115.setter.SecondBean"></bean>
<bean id="setterBean" class="qiudawei115.setter.SetterBean">
<property name="sfb" ref="sfb"></property>
<property name="ssb" ref="ssb"></property>
</bean>
</beans>

测试类
qiudawei115.setter.SetterBeanMain.java
package qiudawei115.setter;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import qiudawei115.constructor.ConstructorBean;
public class SetterBeanMain {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathResource resource=new ClassPathResource("applicationContext.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
SetterBean setterBean=(SetterBean)beanFactory.getBean("setterBean");
setterBean.display();
}

}
这样,我们也完成了Setter注入的实例。
如果还有什么问题或需要源程序和我联系qiuyin_1985@126.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: