Spring三種bean注入方式
(http://glzaction.iteye.com/blog/1299441)
Spring中依賴注入有三種注入方式:
一、構造器注入;
二、設值注入(setter方式注入);
三、Feild方式注入(註解方式注入)。
一、構造器注入
構造器注入顧名思義就是在程式元件中實現構造器,構造器可以是一個也可以是多個。廢話不多說,直接上程式碼。
Java程式碼- package cn.glzaction.service.impl;
- import java.util.List;
-
import cn.glzaction.service.interfaces.PersonDaoIF;
- import cn.glzaction.service.interfaces.PersonServiceIF;
- public class PersonServiceBean implements PersonServiceIF{
- //自定義類
- private PersonDaoIF personDaoBean;
- //String型別
- private String name;
- //集合型別
- private List list;
- //構造器
-
public PersonServiceBean(PersonDaoBean personDaoBean,String name,List list){
- this.personDaoBean = personDaoBean;
- this.name = name;
- this.list = list;
- }
- //方法,用於顯示
- public void display(){
- personDaoBean.add();
- System.out.println(name);
- System.out.println(list);
- }
- }
上面的程式碼中構造器要注入三個引數,同時這三個引數也是三種不同的型別,自定義類、String型別,集合型別,其中自定義類PersonDaoBean 具體的實現我們這裡就不累述了,因為這不是重點。
- <bean id="personDao" class="cn.glzaction.service.impl.PersonDaoBean"></bean >
- <!--構造器方式注入-->
- <bean id="personService" class="cn.glzaction.service.impl.PersonServiceBean">
- <constructor-arg index="0" type="cn.glzaction.service.impl.PersonDaoBean" ref="personDao"/>
- <constructor-arg index="1" type="java.lang.String" value="glzaction"/>
- <constructor-arg index="2" type="java.util.List">
- <list>
- <value>list1</value>
- <value>list2</value>
- <value>list3</value>
- </list>
- </constructor-arg>
- </bean>
java程式碼如何實現構造器我想大家一定都很清楚,否則的話就有點講不過去了,呵呵,所以這裡我也就不加以說明了,主要說一下上面的xml配置。id為“personDao”的bean是PersonServiceBean的私有屬性,它的注入是採用無參構造器的注入方式注入的,這也不詳細說明。主要說一下id為“personService”類的構造器注入。<coustructor-arg>是構造器標籤元素,通過設定它的屬性可以往構造器傳遞引數,index屬性值表示要設定的引數在構造器形參中的索引順序,例如上面的配置,list是第三個引數,所以它對應的索引為2,index是可選屬性,所謂可選並不是說在任何情況下都可以不使用,要視具體情況而定,type為引數的型別,這個也是可選引數。還有兩個很重要的屬性就是ref和value,如果注入的是bean,就要使用ref,ref的值就是對應的bean。如果注入的是基本型別或者string型別就用value,直接將對應的值填入即可。
二、設值注入(setter方式注入)
設值注入就是通過setXxxx方法將bean注入到元件中,自定義類如下
Java程式碼- package cn.glzaction.service.impl;
- import cn.glzaction.service.interfaces.PersonDaoIF;
- import java.util.*;
- public class PersonDaoBean implements PersonDaoIF {
- private String name;
- private Integer id;
- private List list;
- private Map map;
- public void setName(String name) {
- this.name = name;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public void setList(List list) {
- this.list = list;
- }
- public void setMap(Map map) {
- this.map = map;
- }
- @Override
- public void add() {
- // TODO Auto-generated method stub
- System.out.println(map);
- System.out.println(list);
- System.out.println(id);
- System.out.println(name);
- }
- }
採用設定注入只要有setter方法即可,但是有時由於程式設計習慣也會講getter方法引進,但是要清楚:設值注入與getter方法無關。這裡還有一點需要注意,那就是能使用基本型別,如果非要使用基本型別的話就要使用其對應的包裝型別,如上面使用的是Integer而不是int。Spring的xml配置如下:
Xml程式碼- <bean id="personDao" class="cn.glzaction.service.impl.PersonDaoBean">
- <property name="name" type="java.lang.String" value="glzaction"/>
- <property name="id" type="java.lang.Integer" value="1"/>
- <property name="list" type="java.util.List">
- <list>
- <value>list1</value>
- <value>list2</value>
- <value>list3</value>
- </list>
- </property>
- <property name="map" type="java.util.Map">
- <map>
- <entry key="key1" value="value1"></entry>
- <entry key="key2" value="value2"></entry>
- </map>
- </property>
- </bean>
設值注入採用的是<property>標籤元素,其中的name屬性對應的是要注入的變數名,type屬性值對應的該變數的型別,可以是自定義類或者包裝型別。value屬性對應的是相應的值,還有一個ref屬性,該屬性值對應的是bean。