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注入的實例。
如果還有什麼問題或需要源程序和我聯繫[email protected]