- Set注入
1 package com.bless.springdemo.action; 2 public class SpringAction { 3 //注入對象springDao 4 private SpringDao springDao; 5 //一定要寫被注入對象的set方法 6 public void setSpringDao(SpringDao springDao) { 7 this.springDao = springDao; 8 } 9 10 public void ok(){ 11 springDao.ok(); 12 } 13 }
隨后編寫spring的xml文件,<bean>中的name屬性是class屬性的一個別名,class屬性指類的全名,因為在SpringAction中有一個公共屬性Springdao,所以要在<bean>標簽中創建一個<property>標簽指定SpringDao。
<property>標簽中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,
這樣其實是spring將SpringDaoImpl對象實例化並且調用SpringAction的setSpringDao方法將SpringDao注入:
1 <!--配置bean,配置后該類由spring管理--> 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 3 <!--(1)依賴注入,配置當前類中相應的屬性--> 4 <property name="springDao" ref="springDao"></property> 5 </bean> 6 <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
- 構造器注入
1 public class SpringAction { 2 //注入對象springDao 3 private SpringDao springDao; 4 private User user; 5 6 public SpringAction(SpringDao springDao,User user){ 7 this.springDao = springDao; 8 this.user = user; 9 System.out.println("構造方法調用springDao和user"); 10 } 11 12 public void save(){ 13 user.setName("卡卡"); 14 springDao.save(user); 15 } 16 }
在XML文件中同樣不用<property>的形式,而是使用<constructor-arg>標簽,ref屬性同樣指向其它<bean>標簽的name屬性:
1 <!--配置bean,配置后該類由spring管理--> 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 3 <!--(2)創建構造器注入,如果主類有帶參的構造方法則需添加此配置--> 4 <constructor-arg ref="springDao"></constructor-arg> 5 <constructor-arg ref="user"></constructor-arg> 6 </bean> 7 <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 8 <bean name="user" class="com.bless.springdemo.vo.User"></bean>
解決構造方法參數的不確定性,你可能會遇到構造方法傳入的兩參數都是同類型的,為了分清哪個該賦對應值,則需要進行一些小處理:
1 <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 2 <constructor-arg index="0" ref="springDao"></constructor-arg> 3 <constructor-arg index="1" ref="user"></constructor-arg> 4 </bean>
另一種是設置參數類型:
1 <constructor-arg type="java.lang.String" ref=""/>
- 靜態工廠的方法注入
1 package com.bless.springdemo.factory; 2 3 import com.bless.springdemo.dao.FactoryDao; 4 import com.bless.springdemo.dao.impl.FactoryDaoImpl; 5 import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; 6 7 public class DaoFactory { 8 //靜態工廠 9 public static final FactoryDao getStaticFactoryDaoImpl(){ 10 return new StaticFacotryDaoImpl(); 11 } 12 }
同樣看關鍵類,這里我需要注入一個FactoryDao對象,這里看起來跟第一種注入一模一樣,但是看隨后的xml會發現有很大差別:
1 public class SpringAction { 2 //注入對象 3 private FactoryDao staticFactoryDao; 4 5 public void staticFactoryOk(){ 6 staticFactoryDao.saveFactory(); 7 } 8 //注入對象的set方法 9 public void setStaticFactoryDao(FactoryDao staticFactoryDao) { 10 this.staticFactoryDao = staticFactoryDao; 11 } 12 }
Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class並不是FactoryDao的實現類,而是指向靜態工廠DaoFactory,並且配置 factory-method="getStaticFactoryDaoImpl"指定調用哪個工廠方法:
1 <!--配置bean,配置后該類由spring管理--> 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > 3 <!--(3)使用靜態工廠的方法注入對象,對應下面的配置文件(3)--> 4 <property name="staticFactoryDao" ref="staticFactoryDao"></property> 5 </property> 6 </bean> 7 <!--(3)此處獲取對象的方式是從工廠類中獲取靜態方法--> 8 <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
- 實例工廠的方法注入
1 public class DaoFactory { 2 //實例工廠 3 public FactoryDao getFactoryDaoImpl(){ 4 return new FactoryDaoImpl(); 5 } 6 }
那么下面這個類沒什么說的,跟前面也很相似,但是我們需要通過實例工廠類創建FactoryDao對象:
1 public class SpringAction { 2 //注入對象 3 private FactoryDao factoryDao; 4 5 public void factoryOk(){ 6 factoryDao.saveFactory(); 7 } 8 9 public void setFactoryDao(FactoryDao factoryDao) { 10 this.factoryDao = factoryDao; 11 } 12 }
最后看spring配置文件:
1 <!--配置bean,配置后該類由spring管理--> 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 3 <!--(4)使用實例工廠的方法注入對象,對應下面的配置文件(4)--> 4 <property name="factoryDao" ref="factoryDao"></property> 5 </bean> 6 7 <!--(4)此處獲取對象的方式是從工廠類中獲取實例方法--> 8 <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> 9 <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
- 總結
1 <bean name="..." class="..." scope="prototype">
