### 上篇代碼的缺點
[上一篇我們以一個簡單的例子講述了Spring](http://blog.csdn.net/lovesummerforever/article/details/22500339)[的由來](http://blog.csdn.net/lovesummerforever/article/details/22500339),上篇中UserManager調用Dao的時候需要自己去實例化具體的Dao,或者通過工廠創建相應的Dao,最終還是客戶端自己去實例化具體的UserManager,UserManager自己去拿到工廠,工廠自己去創建相應的Dao。而Spring框架封裝了這創建過程,不再是我們自己手動去new,而是交給Spring的IOC容器去做這件事情,他自己(SpringIOC容器)會找,并且根據配置文件找到后new好直接傳遞給我們,不需要我們自己拿工廠去找去實例化。
### 那什么是Spring的IOC容器呢?
IOC(Inversionof Control),這個名詞就叫做控制反轉,控制反轉還有一個名字叫做依賴注入DI(Dependencyinjection)。上篇代碼中我們在UserManagerImpl中這樣調用Dao層,UserDaouserDao = new UserDaoOracleImpl();這樣使用接口編程可以增加代碼的穩定和健壯性等等,但是接口一定是需要實現的,遲早要執行這句代碼,這樣一來耦合關系就產生了。ManagerImpl類與UserDaoOracleImpl類就是依賴關系,當然我們可以使用工廠來創建Dao,如下圖所示。

圖2.1未使用工廠創建Dao

圖2.2使用工廠來創建Dao
使用工廠表面上一定程度解決了以上的問題,但實質上代碼耦合沒有改變。而通過IOC容器可以徹底解決這種耦合,是把耦合的代碼移出去,放到統一的XML文件中,通過一個容器在需要的時候把依賴關系形成,即把需要的接口注入到需要的類中,這就是我們說的“依賴注入”的來源了。IOC容器有很多種,PicoContainer、JBoss、HiveMind、spring,在這里我們主要說的是Spring的IOC容器。
### 下面是使用Spring IOC容器來控制,如下步驟所示。
1、導入Spring依賴包(因為在這里使用的是Spring的IOC,所以導入核心包就可以了)
Spring_home/dist/spring.jar.
另外引入相關日志記錄包,兩個,spring-framework-2.0\lib\log4j\log4j-1.2.14.jar spring-framework-2.0\lib\jakarta-commons\commons-logging.jar
直接在UserLibraries中建立userlibraries然后再導入JARs,之后引入到我們的項目中。
2、提供配置文件applicationContext.xml,放到我們項目的src目錄下,我們可以拷貝Spring?spring-framework-2.0\samples\jpetstore\war\WEB-INF
applicationContext.xml到我們的src目錄下。
3、提供log4j.propertiers配置文件。
4、在UserManagerImpl中提供構造方法或setter方法,讓Spring將UserDao與UserManagerImpl的關系注入(DI)進來。
5、讓Spring管理對象的創建和依賴,必須將依賴關系配置到Spring的核心配置文件中。
[在上一篇代碼中](http://blog.csdn.net/lovesummerforever/article/details/22500339),我們的Dao層代碼不變,我們的UserManagerImpl代碼如下所示。
### UserManagerImpl.java
~~~
public class UserManagerImpl implements UserManager {
//這樣改看不到具體的實現了. 但是在client調用時看到組裝的過程.
private UserDao userDao;
//構造方法進行賦值.
// public UserManagerImpl(UserDao userDao) {
//
// this.userDao = userDao;
// }
//
//通過setter方法來把依賴對象注入。
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String username, String password) {
userDao.addUser(username, password);
}
}
~~~
Spring的依賴注入方法,我們可以通過賦值注入,也就是通過getter和setter方法來獲得和設置Bean的屬性值,我們一般使用這種方法。在Spring中每個對象在配置文件中,均以<bean>的形式出現,而子元素<property>則指明了使用這個JavaBean的setter方法來注入值,在<property>中,可以定義要配置的屬性以及要注入的值,可以將屬性注入任何類型的值,不僅是基本類型的java數據類型,也可以是Bean對象,在這就我們注入的就是Bean對象。
另一種是構造器的注入,不常使用,通過標簽<constructor-arg>來實例化這個Bean的時候需要注入的參數。
### ApplicationContext.xml代碼如下所示。
~~~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userDao4MySql" class="com.bjpowernode.spring.dao.UserDao4MySqlImpl"/>
<bean id="userDao4Oracle" class="com.bjpowernode.spring.dao.UserDao4OracleImpl"/>
<!-- userManager依賴于mysql的實現 -->
<bean id="userManager" class="com.bjpowernode.spring.manager.UserManagerImpl">
<!-- <constructor-arg ref="userDao4MySql"/> -->
<!-- <constructor-arg ref="UserDao4Oracle"/>-->
<property name="userDao" ref="userDao4MySql"/>
</bean>
</beans>
~~~
上面這個XML文件就是Spring中用來配置JavaBean的。通過這樣的一個方式可以把分散的JavaBean組裝一個整體系統,再去實現具體的業務了邏輯。完成了Bean的開發和裝配下一步就是要進行調用和測試了。
### 在客戶端進行調用,代碼如下所示。
~~~
public class client {
public static void main(String[] args) {
//spring中有BeanFactory,是一個接口.
//專門讀取applicationContext.xml文件的實現.
//ClassPathXmlApplicationContext類就是對BeanFactory接口的實現.
//會把applicationContext.xml這個文件讀進來,并且創建對象.
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//產品標識.
UserManager userManager = (UserManager)factory.getBean("userManager");
userManager.addUser("張三", "123");
}
}
~~~
這樣就完成了用SpringIOC容器來解決依賴問題,不需要我們自己去建立工廠,我們只要聲明一個接口,具體的實現在配置文件中告訴SpringIOC容器,他會自己找到并進行創建相應的實例,然后傳遞給我們,本來是由我們自己去控制對象之間的依賴關系,現在由IOC來控制了,這就是控制反轉。這樣我們很輕松就了解了哦。

Spring coming.....
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)