平常的java開發中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,
- 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">

