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。java
<property>標籤中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,程序員
這樣實際上是spring將SpringDaoImpl對象實例化而且調用SpringAction的setSpringDao方法將SpringDao注入:spring
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屬性:less
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>
另外一種是設置參數類型:this
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會發現有很大差異:spa
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"指定調用哪一個工廠方法:prototype
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對象:code
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配置文件:xml
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">