spring是一個很優秀的基於Java的輕量級開源框架,為了解決企業級應用的復雜性而創建的,spring不僅可用於服務器端開發,從簡單性、可測試性和松耦合性的角度,任何java應用程序都可以利用這個思路進行開發,Spring的核心就是控制反轉(IoC)和面向切面(AOP),總的來說,Spring是一個分層的Java輕量級框架
所謂控制反轉就是利用某種技術實現低耦合,對象之間相互的依賴關系是通過被動的方式傳遞進來,而不是對象主動進行另外對象的使用和查找,就是說控制權交給了容器,在初始化的時候,容器將實例化好的對象不用請求就主動傳遞過來,開發過程中不用進行任何的實例化對象就可以使用對象的方法,使用起來也感覺更加的輕松,所有的對象在spring中都是一個bean,spring提供了一種完善的javabean的依賴管理,實際上就是常說的依賴注入,是通過依賴注入的方式實現了控制反轉的操作
面向切面就是通過分離應用程序的業務邏輯和系統級服務,進行高內聚性的開發,應用對象只完成自己該完成的業務邏輯操作,其他的完全不必考慮,例如系統日志或其他事務等系統服務級操作對象完全不必關心,這樣模塊化更加清晰,更加適用於邏輯復雜的業務系統
剛接觸spring時會出現很多不好理解的概念,下面從一個最簡單的例子開始,進入spring的學習,讓spring更加的形象
首先去spring官網下載spring framework框架,官網地址就是spring.io,一個非常簡潔的頁面
然后點擊導航欄的PROJECTS,看到一些比較大塊的項目,單擊SPRING FRAMEWORK
然后就進入了spring framework的首頁,網址是http://projects.spring.io/spring-framework/,向下拉右面有一些介紹文檔點擊超鏈接就可以,或者點擊下面的"the modules section fo the reference documentation"超鏈接查看文檔
然后,就看到了很有名的一張圖片就是spring framework框架的架構原理圖
通過這張圖可以清楚的看出spring的大體構成,繼續下拉頁面,點擊超鏈接:http://repo.spring.io/release/org/springframework/spring/
這個就是最后的下載地址了,里面有所有的歷史版本,自己可以根據需要選擇下載,
我這里下載的是最新的spring framework 4.2.4完整版本:spring-framework-4.2.4.RELEASE-dist.zip,也就是第一個,下載之后解壓出來即可
解壓好之后,打開下面的libs目錄,這里面就是spring framework所有的jar包了,我們打開eclipse建立一個項目,普通項目或者web項目都可以
然后,我們復制必要的jar包,放到項目的某一個指定目錄下或者web項目的lib目錄下,需要的jar包如下圖:
這些就是項目所必須的jar包,需要擴展功能可以根據實際需要導入,復制之后如果是web項目會自動導入到項目,如果是普通項目則需要Build Path導入一下就可以使用了,其中junit-4.1.0.jar不是必須的,這只是單元測試所需要的一個jar包;commons-logging-1.2.jar項目中是沒有的,它是Apache的日志管理工具,spring為了所有的java應用程序進行統一的日志接口管理,所以需要下載commons-logging.jar這個包,下載地址是:http://commons.apache.org/proper/commons-logging/index.html,進入后點擊Download下載就行,然后和spring的包一起導入
包都導入完畢了,接下來實現一個很簡單的功能,我們建立一個接口,實現的就是輸出一句話,代碼如下:
1 package net.zengzhiying.spring; 2 3 public interface IHelloMessage { 4 public String sayHello(); 5 }
有兩個類分別實現這個接口,分別返回中文的"大家好!"和英文的"HelloWorld!",代碼如下:
1 package net.zengzhiying.spring; 2 3 public class HelloChina implements IHelloMessage { 4 5 @Override 6 public String sayHello() { 7 return "大家好!"; 8 } 9 10 }
1 package net.zengzhiying.spring; 2 3 public class HelloWorld implements IHelloMessage { 4 5 @Override 6 public String sayHello() { 7 return "HelloWorld!"; 8 } 9 10 }
按照一般的使用,我們會分別實例化對象調用里面的方法使用,或者利用多態的概念通過接口來統一實例化對象使用里面的方法,其實有了spring就不用了,我們現在建立一個實體的類,用來放置接口實例化出的對象,
1 package net.zengzhiying.spring; 2 3 public class Person { 4 private IHelloMessage helloMessage; 5 6 public Person() { 7 8 } 9 10 //帶參構造器注入 11 public Person(IHelloMessage helloMessage) { 12 this.helloMessage = helloMessage; 13 } 14 15 public IHelloMessage getHelloMessage() { 16 return helloMessage; 17 } 18 19 public void setHelloMessage(IHelloMessage helloMessage) { 20 this.helloMessage = helloMessage; 21 } 22 23 public String sayHello() { 24 return this.helloMessage.sayHello(); 25 } 26 27 }
這個類就是一個Bean,一般的規范就是屬性私有,並且設置get/set方法,分別有無參的和帶參的構造方法,方便使用構造器進行對象的注入,這些類編寫完了,然后我們在項目根目錄下編寫一個配置文件helloMessage.xml,就是這個核心的配置文件,交代了spring應該怎么樣對容器中的對象進行管理,所以說這個xml配置文檔是spring的最重要的部分之一,我們配置代碼如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 3 "http://www.springframework.org/dtd/spring-beans.dtd"> 4 <beans> 5 6 <bean id="helloWorld" class="net.zengzhiying.spring.HelloWorld"></bean> 7 8 <bean id="helloChina" class="net.zengzhiying.spring.HelloChina"></bean> 9 10 <bean id="person" class="net.zengzhiying.spring.Person"> 11 <!-- 配置依賴關系 控制反轉 get/set方法注入 --> 12 <!-- <property name="helloMessage" ref="helloWorld"></property> --> 13 14 <!-- 構造器注入 --> 15 <constructor-arg ref="helloWorld" /> 16 </bean> 17 18 </beans>
除了通用的頭部聲明外,所有的配置代碼都寫到<beans>里面,<bean>就是我們需要控制反轉的所有類,然后后面需要向Person中進行對象的注入,可以用過get/set方法進行注入,也可以通過構造方法進行注入,name就是注入的屬性名,ref就是需要將哪個類的實例化對象注入進去,這樣就完成了簡單的配置,也不難理解
接下來我們配置主類,用來執行相應的方法,代碼如下:
1 package net.zengzhiying.spring; 2 3 import org.springframework.beans.factory.BeanFactory; 4 import org.springframework.beans.factory.xml.XmlBeanFactory; 5 import org.springframework.core.io.FileSystemResource; 6 import org.springframework.core.io.Resource; 7 8 public class Main { 9 10 public static void main(String[] args) { 11 //引入配置文件 12 Resource r = new FileSystemResource("helloMessage.xml"); 13 //加載配置文件 14 BeanFactory f = new XmlBeanFactory(r); 15 //獲取Person實例 16 Person person = (Person) f.getBean("person"); 17 String s = person.sayHello(); 18 System.out.println(s); 19 } 20 21 }
現在只需要引入並加載配置文件,調出bean對象,然后就可以任意使用所有的類中的方法了,可以通過注入不同的類實現不同的操作,結果如下:
同樣的,現在我們也可以通過注入HelloChina類來輸出大家好!實現起來也比較簡單
以上就是一個簡單的spring初學小例子,體現了依賴注入的方式和控制反轉的思想,spring讓復雜應用的開發變得清晰簡單了