分類  >  Web前端 >

Spring之流入

tags:    時間:2013-12-10 09:37:00
Spring之注入


本次要向大家介紹一下Spring的注入,包括屬性注入對象注入構造方法注入集合注入。在介紹之前,先做一些準備工作。

首先新建一個JAVA項目,名為SpringDemo。

然後為項目導入Spring開發包(目前最新的是3.2.0版本),光導入Spring包還不夠,需要下載commons-logging開發包。

Spring:http://www.springsource.org/download/community

commons-logging:http://commons.apache.org/logging/download_logging.cgi


在進行注入演示之前,我們需要一個測試類,這裡我們寫一個簡單的三角形(Triangle)類.


package zjut.edu.spring;  public class Triangle {  	private String type;  	public String getType() { 		return type; 	}  	public void setType(String type) { 		this.type = type; 	} } 

再來是含有main方法的測試類:


package zjut.edu.spring;  import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Test {  	/** 	 * @param args 	 */ 	public static void main(String[] args) { 		BeanFactory factory = new ClassPathXmlApplicationContext("springconfig.xml"); 		Triangle triangle = (Triangle) factory.getBean("triangle"); 		System.out.println(triangle.getType()); 	}  } 


main方法里的代碼不懂沒關係,下面會進行講解的。


一. 屬性注入:

通常我們如果想要獲得一個Triangle類的實例,我們會這樣來寫。

Triangle triangle = new Triangle();

有了Spring容器,它會替我們來做這部分工作,雖然不用寫代碼了,但是我們需要一個spring的配置文件,這裡我們假設取名為springconfig.xml(放在classpath里)。其內容為:

<?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.5.xsd"> 		 	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<property name="type" value="saojiaoxing"/> 	</bean> </beans>

在這個配置文件中,首先是一個根節點beans,根節點下是子節點bean。

如果我們想要實現屬性注入,需要寫自己的bean:

	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<property name="type" value="sanjiaoxing"/> 	</bean>

bean標籤里的id屬性代表實例名稱,class屬性代表類的全路徑(full qualified name),接下來,在bean標籤內部有一個property子標籤,負責為屬性賦值,name對應於Triangle類的屬性名(type),value屬性顧名思義為屬性值。


配置文件配好后,要想得到該bean,我們需要先讀取配置文件:

		BeanFactory factory = new ClassPathXmlApplicationContext("springconfig.xml");

因為ClassPathXmlApplicationContext負責讀取類路徑下的xml文件,所以spring配置文件必須放在src目錄下(當然String API 下還有其它的類不需要將配置文件放在src目錄下),該類返回的是一個bean工廠,該工廠讀取配置文件后負責返回bean對象。

		Triangle triangle = (Triangle) factory.getBean("triangle");

這裡調用工廠的方法getBean,傳入的值即為bean標籤的id屬性值。由於返回的是Object對象,所以需要強制轉換。

		System.out.println(triangle.getType());

運行一下,看看:

十一月 19, 2012 10:46:34 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1263db: startup date [Mon Nov 19 22:46:34 CST 2012]; root of context hierarchy 十一月 19, 2012 10:46:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [springconfig.xml] 十一月 19, 2012 10:46:35 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@36eb76: defining beans [triangle]; root of factory hierarchy sanjiaoxing

二.對象注入,上面的例子中,Triangle的欄位是String類型,當然也可以是原始類造型(Primitive Type),如果我們把Triangle類稍微改造一下 :


package zjut.edu.spring;  public class Triangle {  	private Point point;  	public Point getPoint() { 		return point; 	}  	public void setPoint(Point point) { 		this.point = point; 	}  	public void draw() { 		System.out.println(point); 	} } 

我們將type屬性取消掉,換成一個Point類型的欄位(因為三角形有點):

package zjut.edu.spring;  public class Point {  	private int x; 	private int y; 	public int getX() { 		return x; 	} 	public void setX(int x) { 		this.x = x; 	} 	public int getY() { 		return y; 	} 	public void setY(int y) { 		this.y = y; 	} 	 	@Override 	public String toString() { 		return "Point [x=" + x + ", y=" + y + "]"; 	}  } 

我們的Point類也很簡單,有橫縱坐標,並且覆蓋了toString()方法(為了測試數據用)

現在我們依然想將Point注入到Triangle類中,在配置文件中,我們應該這樣來寫bean

	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<property name="point"> 		    <bean class="zjut.edu.spring.Point"> 		        <property name="x" value="1" /> 		        <property name="y" value="2" /> 		    </bean> 		</property> 	</bean>

在我們的triangle標籤里,我們有一個point屬性標籤,由於該屬性是Object類型,因此,我們在property標籤內嵌套了一個內部bean,該bean的功能是實例化一個point對象,並對該對象的橫縱坐標賦值(1,2)

當然,我們也可以將內部bean和triangle的bean平行.


	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<property name="point" ref="point0"></property> 	</bean> 	    <bean id="point0" class="zjut.edu.spring.Point"> 		<property name="x" value="1" /> 		<property name="y" value="2" />    </bean>

配置好bean后,我們在主類中測試下:

	public static void main(String[] args) { 		BeanFactory factory = new ClassPathXmlApplicationContext("springconfig.xml"); 		Triangle triangle = (Triangle) factory.getBean("triangle"); 		triangle.draw(); 	}

十一月 19, 2012 10:59:06 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1263db: startup date [Mon Nov 19 22:59:06 CST 2012]; root of context hierarchy 十一月 19, 2012 10:59:07 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [springconfig.xml] 十一月 19, 2012 10:59:07 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@161116f: defining beans [triangle,point0]; root of factory hierarchy Point [x=1, y=2]

三.構造方法注入。

就像Servlet容器管理servlet一樣,bean的生命周期也是由Spring容器管理的。如果我們想要通過初始化的方法對屬性賦值,我們應該這樣來寫bean.


我們改寫下Triangle:

package zjut.edu.spring;  public class Triangle {  	private String type;  	public Triangle(String type) { 		this.type = type; 	}  	public void draw() { 		System.out.println(type); 	} } 

為了簡單點,這裡的構造方法的參數為String類型,(Object類型的可以自己去試一下)

	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<constructor-arg index="0" value="I'm triangle"></constructor-arg>	 	</bean>

constructor-arg標籤就是構造方法注入的核心標籤,index屬性表示參數的位置,value表示參數值(還有type屬性,說明該參數的類型)

最後一個注入:集合注入,我們再改一下Triangle類:


package zjut.edu.spring;  import java.util.List;  public class Triangle {  	private List<Point> points; 	 	public List<Point> getPoints() { 		return points; 	}  	public void setPoints(List<Point> points) { 		this.points = points; 	}  	public void draw() { 		for(Point point : points) { 			System.out.println(point); 		} 	} } 

該類的欄位為集合類型,我們看下怎麼寫配置文件中的bean標籤.


	<bean id="triangle" class="zjut.edu.spring.Triangle"> 		<property name="points"> 		    <list> 		        <ref bean="point0"/> 		        <ref bean="point1"/> 		        <ref bean="point2"/> 		    </list> 		</property>	 	</bean> 	 	<bean id="point0" class="zjut.edu.spring.Point"> 	    <property name="x" value="0" /> 	    <property name="y" value="20"/> 	</bean> 	 	<bean id="point1" class="zjut.edu.spring.Point"> 	    <property name="x" value="0" /> 	    <property name="y" value="-20"/> 	</bean> 	 	<bean id="point2" class="zjut.edu.spring.Point"> 	    <property name="x" value="10" /> 	    <property name="y" value="10"/> 	</bean>

下我們的輸出:

Point [x=0, y=20] Point [x=0, y=-20] Point [x=10, y=10]


Over... 勉強を続けている!

推薦閱讀文章

Bookmark the permalink ,來源:互聯網