1.Spring概述
Spring是一個(gè)開源框架,它能夠降低開發(fā)企業(yè)應(yīng)用程序的復(fù)雜性,可以使用Spring替代EJB開發(fā)企業(yè)級(jí)應(yīng)用,而不用擔(dān)心工作量太大、開發(fā)進(jìn)度難以控制和復(fù)雜的測(cè)試過程等問題。Spring簡化了企業(yè)級(jí)應(yīng)用的開發(fā),降低了開發(fā)成本,能夠整合各種流行框架。它以IoC(控制反轉(zhuǎn))和AOP(面向切面編程)兩種先進(jìn)的技術(shù)為基礎(chǔ),完美的簡化了企業(yè)級(jí)開發(fā)的復(fù)雜度。
1.1初識(shí)Spring
Spring框架主要由七大模塊組成,他提供了企業(yè)級(jí)開發(fā)需要的所有功能,而且每個(gè)模塊都可以單獨(dú)使用,也可以和其他莫款組合使用,靈活且方便的部署可以使開發(fā)的程序更加簡潔。

- 核心模塊:Spring Core模塊是Spring的核心容器,他實(shí)現(xiàn)了IoC模式,提供了Spring框架的基礎(chǔ)功能,在模塊中包含最重要的BeanFactory類是Spring的核心類,負(fù)責(zé)對(duì)JavaBean的配置和管理。他采用了Factory模式實(shí)現(xiàn)了IoC容器,即依賴注入
2.Context模塊:Spring Context模塊繼承BeanFactory(或者說是Spring核心)類,并且添加了事件處理、國際化、資源裝載、透明裝載以及數(shù)據(jù)校驗(yàn)等功能。他還提供了框架式的Bean的訪問方式和很多企業(yè)級(jí)的功能,如JNDI訪問、支持EJB、遠(yuǎn)程調(diào)用、集成模板框架、E-mail和定時(shí)任務(wù)調(diào)度等。
3.AOP模塊:Spring集成了所有的AOP功能。通過事務(wù)管理可以使任意Spring管理的對(duì)象AOP化。Spring提供了用標(biāo)準(zhǔn)Java語言編寫的AOP框架,他的大部分內(nèi)容都是根據(jù)AOP聯(lián)盟的API開發(fā)的,他使應(yīng)用程序拋開EJB的復(fù)雜性,但擁有傳統(tǒng)EJB的關(guān)鍵功能。
4.DAO模塊:提供JDBC的抽象層,簡化了數(shù)據(jù)庫廠商的異常錯(cuò)誤,大幅度減少代碼的編寫,并且提供了對(duì)聲明式事務(wù)和編程式事務(wù)的支持。
5.ORM模塊:提供對(duì)現(xiàn)有ORM框架的支持,各種流行的ORM框架已經(jīng)做的非常成熟了,所以沒有必要開發(fā)新的ORM工具,但是他對(duì)Hibernate提供了完美的整合功能,同時(shí)也支持其他的ORM工具。
6.WEB模塊:建立在Spring Context基礎(chǔ)之上,他還提供了Servlet監(jiān)聽器的Context和Web應(yīng)用的上下文,對(duì)現(xiàn)有的Web框架提供集成。
7.MVC模塊:建立在Spring的核心功能之上,這使得他能擁有Spring框架的所有特性,能夠適應(yīng)多種視圖,模塊技術(shù)、國際化和驗(yàn)證服務(wù),實(shí)現(xiàn)控制邏輯和業(yè)務(wù)邏輯清晰的分離。
2.準(zhǔn)備
在開始進(jìn)行開發(fā)之前,我們首先需要獲得Spring工具包、commons-logging包。并且我們可以簡單的查看一下他們的官方文檔。之后,我們就能正常的開展下一步了。
3.第一個(gè)Spring實(shí)例
筆者在介紹的過程中,先給出一個(gè)完整的spring簡單實(shí)例,可以大體上的了解一些Spring的開發(fā)過程,然后,我們?cè)龠M(jìn)行介紹里面的原理。
步驟:
- 首先,我們?cè)趀clipse中建立一個(gè)JavaProject,并創(chuàng)建SpringDemo工程
- 其次,在SpringDemo工程的src目錄下創(chuàng)建com.bean包,在該包下分別創(chuàng)建Person.java、ChineseImpl.java和AmercianImpl.java 3個(gè)文件,編輯代碼如下:
代碼清單1:person.java
package com.bean;
public interface Person {
public void speak();
}
代碼清單2:ChineseImpl.java
package com.bean;
public class ChineseImpl implements Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("我是中國人,我的名字是" + this.name + ", 我今年" + this.age + "歲!");
}
}
代碼清單3:AmercianImpl.java
package com.bean;
public class AmercianImpl implements Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("我是美國人,我的名字是" + this.name + ",我今年" + this.age + "歲!");
}
}
上面的代碼中,我們定義了一個(gè)person接口,通過該接口規(guī)定了Person的規(guī)范,并且進(jìn)行了兩個(gè)實(shí)例,在我們進(jìn)行代碼的編寫的過程中,我們可以使用接口與實(shí)現(xiàn)的分離,這樣可以大大的增大代碼的重用性以及復(fù)用性。
那么,問題來了?在Spring中顯然應(yīng)該讓Spring容器來負(fù)責(zé)調(diào)用這兩個(gè)類的Setter方法以設(shè)置實(shí)例中屬性的值。這在Spring中是如何實(shí)現(xiàn)的呢?根據(jù)我們?cè)趯W(xué)習(xí)Struts2以及Hibernate中的知識(shí)我們可以想到應(yīng)該使用XML配置文件來實(shí)現(xiàn)。下面我們?cè)赟pring中使用配置文件applicationContext.xml來告知容器應(yīng)該如何對(duì)AmericanImpl和ChineseImpl進(jìn)行配置
- 在src目錄下創(chuàng)建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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 配置chinese實(shí)例,其實(shí)現(xiàn)類com.bean.ChineseImpl -->
<bean id="chinese" class="com.bean.ChineseImpl">
<!-- 將值“小明”注入給name屬性 -->
<property name="name">
<value>小明</value>
</property>
<!-- 將值10注入給age屬性 -->
<property name="age">
<value>10</value>
</property>
</bean>
<bean id="amercian" class="com.bean.AmercianImpl">
<!-- 將值"Tom”注入給name屬性 -->
<property name="name">
<value>Tom</value>
</property>
<!-- 將值15注入給age屬性 -->
<property name="age">
<value>15</value>
</property>
</bean>
</beans>
上面的XML文件在Spring容器中聲明了一個(gè)ChineseImpl實(shí)例chinese和一個(gè)AmercianImpl實(shí)例amercian并為其中的set方法進(jìn)行賦值。
- Test類
在src目錄下創(chuàng)建com.spring包,在該包下創(chuàng)建Test.java文件。
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bean.Person;
public class Test {
public static void main(String[] args) {
/*創(chuàng)建spring容器*/
//當(dāng)然這里還有beanFactory接口,也能實(shí)現(xiàn)這種功能,ApplicationContext增加了更多的企業(yè)級(jí)應(yīng)用
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
/*獲取ChineseImpl實(shí)例的引用*/
Person person = (Person) context.getBean("chinese");
//調(diào)用ChineseImpl實(shí)例的speak()方法
person.speak();
person = (Person) context.getBean("amercian");
person.speak();
}
}
程序中。我們需要注意的是spring容器的創(chuàng)建,這樣就能將applicationContext.xml文件加載進(jìn)容器中,并且進(jìn)行實(shí)例化,以及調(diào)用set方法進(jìn)行賦值,這樣就能為其中實(shí)現(xiàn)一個(gè)最基本的Spring操作應(yīng)用了。
**
ChineseImpl和AmericanImpl類的實(shí)例并不是main()方法來創(chuàng)建的,而是通過將applicationContext.xml文件加載后,交付給Spring框架,當(dāng)執(zhí)行g(shù)etBean()方法時(shí),就可以得到要?jiǎng)?chuàng)建實(shí)例的引用,因此,調(diào)用者并沒有創(chuàng)建實(shí)例,而是通過Spring框架將創(chuàng)建好的實(shí)例注入調(diào)用者中,這實(shí)際上就是Spring的核心控制:依賴注入(DI),而Spring強(qiáng)大的地方就在于他可以使用依賴注入將一個(gè)Bean注入到另一個(gè)Bean中。
**
4. Spring的IoC容器
Spring的IoC容器是一個(gè)提供IoC支持的輕量級(jí)容器,IoC容器為管理對(duì)象之間的依賴關(guān)系提供了基礎(chǔ)功能。Spring為我們提供兩種容器:BeanFactory和ApplicationContext。
BeanFactory在Spring中的作用至關(guān)重要,他實(shí)際上是一個(gè)用于配置和管理Java類的內(nèi)部接口。顧名思義,BeanFactory就是一個(gè)管理Bean的工廠,它負(fù)責(zé)初始化各種Bean并調(diào)用他們的生命周期方法。
當(dāng)然,在進(jìn)行XML文件的配置的時(shí)候,我們也可以選擇使用annotation(注解)來進(jìn)行編寫里面的配置關(guān)系,而且感覺上比使用XML文件來的更加的直接方便。
5.Spring框架的優(yōu)勢(shì)
- Spring框架能夠有效的組織中間層對(duì)象,Spring框架能夠有效的將現(xiàn)有的框架如Struts和Hibernate框架組織起來。
- Spring框架實(shí)現(xiàn)了真正意義上的面向接口編程,可實(shí)現(xiàn)組件之間的高度解耦,而面向接口編程是一種良好的編程習(xí)慣。
- Spring所秉承的設(shè)計(jì)思想就是讓使用Spring創(chuàng)建的那些應(yīng)用都盡可能少地依賴于它的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象都不依賴于Spring。
- 使用Spring構(gòu)建的應(yīng)用程序易于進(jìn)行單元測(cè)試
- Spring提高了代碼的可重用性,它盡可能避免在程序中使用硬解碼。Spring可以將應(yīng)用程序中的某些代碼抽象出來,然后在其他程序中使用這些代碼。
- Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,簡化了底層數(shù)據(jù)庫的訪問方式。