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


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,然後利用該BeanSetter方法完成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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章