[置頂] 【SSH進階之路】Spring簡介,搭建Spring環境――輕量級容器框架(一)
來源:程序員人生 發布時間:2015-01-12 08:59:32 閱讀次數:3737次
經過對Struts和Hibernate的學習,我們酷寒的冬季(Hibernate),終究迎來了陽光燦爛的春季(Spring)。在系列博客開篇【SSH進階之路】Struts
+ Spring + Hibernate 進階開端(1),我們介紹了Spring的基本概念,和比較重要的兩大核心IoC和AOP,基本上介紹的比較簡單,1句話帶過。從這篇博客開始,我們開始重新介紹Spring框架的基本理論,并搭建1個簡單的Spring開發環境。
Spring是甚么?
Spring是1個集成了許多第3方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程),所以spring既是1個IoC容器,也是1個AOP框架。知道了甚么是Spring是學習的開端,下面說1下為何使用Spring。
為何使用Spring?
我們知道沒有Spring,Struts和Hibernate可以很好的工作,在開篇中我把沒有Spring的架構稱為“獨木橋”,有Spring的架構稱為“陽光大道”。說白了,Spring解決了企業利用開發的復雜性,用基本的javaBean來完成EJB的事情,從大小和開消方向說,Spring都是輕量級的。Spring具有很多的優點:
1、使我們的分層更好。
SSH框架系統從職責上分為4層:表示層、業務邏輯層、數據持久層和域模塊層(實體層)。

從上圖我們可以看到Spring處于業務邏輯層,擔負連接Struts和Hibernate橋梁的角色。系統的全部層次關系可以1目了然。
2、對象管理更好。
從上圖,我們看到Spring將Transactions、Session和業務層服務都放到了業務邏輯層來管理。系統的條理變得更加清晰,不但使持久化層的職責更加單1,而且提高了系統的靈活性。
3、AOP
面向切面編程,AOP讓開發人員創建非行動性的關注點,并將它們插入到利用代碼紅。公共服務(比如日志、持久性、事務等)就能夠就能夠分解成方面并利用到域對象上,同時不會增加域對象的對象模型的復雜性。
4、IoC
IoC,用白話來說,就是由容器控制程序之間的關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由利用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。
用處
對Spring的用處很多,但是Spring的核心和經典我們可以簡化為3部份:
1、IoC容器可以將對象之間的依賴關系交由Spring管理,進行控制。
2、AOP方便進行面向切面編程,是oop的擴大,想加甚么功能直接加。
3、能夠集成各種優秀的框架,struts、Hibernate等等,還有很多,不再逐一羅列。
架構圖

相信你能看出來這是Spring的架構圖,Spring包括了許多的特性,其實都包括在6個模塊中:Core、AOP、DAO、ORM、JEE和Web,其實我們對它們其實不陌生,當你學習或使用Spring時,最少已使用了3部份的內容:DAO、ORM(對象關系映照)、Web。下面我們逐一看1下:
1、DAO
DAO框架封裝了所有的數據庫訪問的操作,Spring提供了對DAO的支持,還有模版jdbc,進1步封裝了jdbc。不論是Spring jdbc還是各種ORM框架(Hibernate、iBatis、MyBatis),它們都對JDBC做了進1步的封裝,使數據訪問層的操作更加靈活、易用。固然,它們也各有各的優缺點,在項目技術選型時非常重要的1項。同時,Spring還可以集成第3方的框架。
2、ORM
Spring提供了對ORM框架的支持,能夠集成大多主流的ORM框架。JPA是1個java持久化注解的規范,Hibernate是1種對JPA的實現。TopLink是Oracle的1個ORM框架;JDO是sun公司的1個規范。OJB是appach的。IBatis不是嚴格意義上的ORM,ORM1般是對云數據的映照,描寫類和屬性,它是基于SQL的映照器。由于ORM框架層見疊出,種類繁多,大家可以自行查1下它們是哪一個公司的產品,和各自優缺點等等。
3、Web
Spring不但具有自己的表示層SpringMVC,同上面1樣,它還也能夠支持第3方的表示層框架struts,webwork,和1些第3方的工具。
這篇博文,我們剩下Spring最核心的3部份,后面的博文我會逐一詳細介紹。下面我們搭建1個Spring的添加用戶的開發環境:
搭建Spring開發環境
1、下載SpringFramework,并解緊縮到指定目錄。我使用的是Spring3.2.9,使用哪一個版本無所謂只要將jar加入到項目便可。
2、在IDE中新建1個java項目,并將Spring所需jar加入到項目中,我所用IDE為MyEclipse。
3、Spring采取Apache common_logging,并結合Apache log4j作為日志輸出組件。為了在調試進程中能視察到Spring的日志輸出,在CLASSPATH中新建log4j.properties配置文件,內容以下:
<span style="font-size:12px;">log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n</span>
4、提供Spring配置文件applicationContext.xml。
5、編寫代碼
配置完成以后,目錄結構以下圖所示:

UserDao接口
public interface UserDao {
public void addUser(String userName,String password);
}
UserDao的實現
UserDao4MysqlImpl
public class UserDao4
MySqlImpl implements UserDao {
public void addUser(String userName,String password){
System.out.println("UserDao4
MySqlImpl.addUser()");
System.out.println("userName="+userName);
System.out.println("password="+password);
}
}
UserDao4Oracelmpl
<span style="font-size:12px;">public class UserDao4
OracleImpl implements UserDao {
public void addUser(String userName,String password){
System.out.println("UserDao4
OracleImpl.addUser()");
System.out.println("userName="+userName);
System.out.println("password="+password);
}
}</span>
UserManager接口
public interface UserManager {
public void addUser(String userName,String password);
}
UserManager的實現
import com.liang.spring.dao.UserDao;
public class UserManagerImpl implements UserManager {
//定義1個成員變量,使用構造方式賦值
private UserDao userDao;
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
/**
* set注入
* @param userDao
*/
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
@Override
public void addUser(String userName, String password) {
userDao.addUser(userName, password);
}
}
客戶端
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.liang.spring.manager.UserManager;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//由我們的利用程序負責服務(對象)定位
//這是1個組裝進程,userManager用userDao,這類關系是用程序描寫的,現在用配置文件描寫
//UserManager userManager = new UserManagerImpl(new UserDao4
MySqlImpl());
//userManager.addUser("張3", "123");
//BeanFactory是1個接口,有不同的實現,ClassPathXmlApplicationContext是對beanFactory的實現
//把applicationContext.xml讀進來
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//ApplicationContext都實現了beanFactory的接口
//ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//getBean加產品標識,相當與userManager的實現,再轉化為userManager的接口
UserManager userManager =(UserManager)factory.getBean("userManager");
userManager.addUser("jiuqiyuliang", "123456");
}
}
Spirng的配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF⑻"?>
<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⑵.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop⑵.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx⑵.0.xsd">
<!-- id是唯1性標識,不能重-->
<!-- 相當于工廠1樣-->
<bean id="userDao4Mysql" class="com.liang.spring.dao.UserDao4
MySqlImpl"></bean>
<bean id="userDao4
Oracle" class="com.liang.spring.dao.UserDao4
OracleImpl"></bean>
<!-- userManager使用userDao接口,userDao使用構造函數將依賴關系給userManager-->
<!-- userManager依賴哪寫dao,IoC容器不但是1個工廠,它提供了管理依賴的能力。
-->
<bean id="userManager" class="com.liang.spring.manager.UserManagerImpl">
<!-- 使用的構造函數,描寫了1個種依賴關系。userManager依賴于Mysql的實現
容器提供了查找能力,找到以后new好,以后會給userManager,放到userManager的進程
為DI,依賴注入。(主動注入)-->
<constructor-arg ref="userDao4Mysql"></constructor-arg>
<!--或
<constructor-arg ref="userDao4
Oracle"></constructor-arg>
-->
</bean>
</beans>
在上面的配置文件中可以自由的切換各種數據庫的實現,DAO層的靈活性可想而知。
項目的測試結構:

大家對不明白的地方看代碼中的注釋便可,我給大家提供兩個版本的源碼:
Spring2與源碼
Spring3.2.9與源碼
總結
最后,今天先介紹這么多,我們對Spring的認識才剛剛開始,僅是冰山1角。對Spring,我更喜歡用下面的8個字形容:海納百川,有容乃大。
下篇博文介紹IoC的幾種注入方式,謝謝關注。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈