Spring的初步認識

一、 企業級Java開發與J2EE

        不同於坐在學校寢室筆記本前編寫Java課堂作業這樣的小打小鬧,Java企業級開發涉及到很多方面的技術,如數據庫、Web應用服務、事務處理等,需要考慮性能、安全、可擴展性等一系列需求。很多公司在進行企業級開發時,爲了提高應用的可擴展性和複用性,都會開發自己的通用服務模塊,這些服務性的軟件系列統稱爲中間件。中間件處於操作系統和更高一級的應用程序之間,作用是使應用程序運行環境和操作系統隔離,使開發者無需爲系統問題干擾,從而把注意力集中在應用程序解決問題的能力上。

        而各公司開發的中間件沒有遵循統一的規範,用戶無法將各公司的中間件組裝在一起使用。爲了提出標準的規範,Sun公司在1998年發表了JDK1.2版本, 並使用了新名稱Java 2 Platform,即“Java2平臺”,修改後的JDK稱爲Java 2 Platform Software Develping Kit,即J2SDK。並分爲標準版(Standard Edition,J2SE), 企業版(Enterprise Edition,J2EE),微型版(MicroEdition,J2ME)。


二、Spring框架

       在Java Web方面應用最廣泛的框架是SSH框架,即Struts+Spring+Hibernate三個框架的集合。Spring框架已成爲基於POJO的輕量級開發框架的領導者,主要特性是依賴注入(DI)和麪向切面編程(AOP),背後的根本目的都是爲了簡化Java開發。下面分別從Spring的三種策略講解爲什麼Spring能簡化Java開發。

2.1   基於POJO的最小侵入性編程

        POJO( Plain Old Java Object)簡單的Java對象,實際就是普通JavaBeans,是爲了避免和EJB混淆所創造的簡稱。POJO可以理解爲簡單的實體類,只有一些屬性及簡單的getter和setter方法,沒有業務邏輯。下面就是一個最簡單的POJO對象:

public class Person {

	private String name;
	
	public void setName(String name) {
		this. name=name;
	}
	
	public String getName() {
		return name;
	}
}
        這樣一個POJO有什麼用呢?其實它在J2EE開發中很常見,應用Hibernate框架能能夠使POJO對象與數據庫中的表對應、對象屬性與表中的字段對應,從而使程序員能夠像操作對象一樣操作數據庫表單。

        如果使用EJB2貨其他重量級框架,這樣一個簡單的JavaBean也會變得很臃腫,因爲他們強迫開發中編寫大量冗餘代碼,而且通常難以編寫測試代碼。而Spring不會強迫開發中實現Spring規範的接口,在類上看不出任何Spring的痕跡,因爲Spring是通過依賴注入來裝配類的。

2.2  通過依賴注入和麪向接口實現鬆耦合

        依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協助時,在 傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在Spring裏,創建被調用者的工作不再由調用者來完成,因此稱爲控制反轉;創建被調用者 實例的工作通常由Spring容器來完成,然後注入調用者,因此也稱爲依賴注入。參考:什麼是依賴注入

        當我們脫離整個程序只有一個類的課堂作業式的編碼後,會發現任何一個有實際意義的應用都是由兩個或更多的類組成,這些類之間相互協作,完成特定的業務邏輯。通常的習慣是每個對象負責管理與自己相互協作的對象(即它所依賴的對象)的引用,然而等程序龐大起來,往往數十個類相互協作,這樣會導致程序高度耦合,不易擴展和修改,更加難以測試。示例:

public class Freshman implements Student{
	private EnglishClass oneClass;
	
	public Freshman(){
		oneClass = new EnglishClass();
	}
	
	public void goToClass(){
		oneClass.take();
	}
}

        Freshman類和EnglishClass類緊密地耦合在一起,極大地限制了大一學生的課堂範圍,如果學生要上數學課,那麼又得重新在構造函數裏new一個數學課。       

        耦合具有兩面性:緊密耦合的代碼難以複用,並且典型地表現出“打地鼠”式的bug,修改完一個bug又冒出更多bug;另一方面,代碼又不可能不耦合,不同的類必須以適當的方式交互。所以應該謹慎地管理耦合。

        通過面向接口編程和依賴注入,就可以使對象無需自行創建或管理它們的依賴關係——依賴關係會被自動的注入到需要他們的對象中去。依賴注入通常有兩種方式:設值注入和構造注入,以下是構造注入的示例:

public class Freshman implements Student {
	private OneClass oneClass;

	public Freshman(OneClass oneClass){
		this.oneClass = conClass;
	}

	public void goToClass(){
		oneClass.take();
	}
}
        不同於之前自行創建課堂任務,在構造大一學生對象時把課堂任務的接口當做構造器參數傳入,這就是構造器注入。在這裏大一學生沒有與具體的課堂發生耦合,對他來說,只要接受一門課就行了,具體是哪門課在構造對象時,再傳入課堂接口的具體實現即可。這就是依賴注入最大的好處——鬆耦合。

        我們可以應用Spring來裝配Bean,最常見的裝配方式是採用XML配置,如下面的配置文件把具體的課堂實現傳給學生類:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	<bean id="student" class="com.springlearning.pojo.Freshman">
       		<constructor-arg ref="oneClass">
	</bean>

	<bean id="oneClass" class="com.springlearning.pojo.EngliseClass">
	</bean>
<beans>

        現在已經聲明瞭類之間的關係,只需要裝載XML配置文件就能把應用啓動起來。Spring通過通過應用上下文(Application Context)來裝載XML,創建和組裝對象。應用上下文有很多中實現,如ClassPathXmlApplicationContext,該類能夠加載位於應用系統classpath下的一個或多個XML文件。下面的示例調用該類加載student.xml,並獲得Student對象的引用。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class main {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("student.xml");
		
		Student s = (Student) context.getBean("student");
		s.goToClass();
	}
}
        我們完全不知道學生上了哪門課,而且也不知道是大一學生上課,只有student.xml文件知道大幾的學生上了哪門課。這就是Spring的依賴注入。

2.2  基於切面和模板減少樣板式代碼

        依賴注入讓相互協作的軟件組件保持鬆散耦合,而AOP編程允許你把遍佈應用各處的功能分離出來形成可重用的組件。

        寫博客太耗時間了,╮(╯﹏╰)╭ , 其他方面參考書籍:《Spring 實戰》。














發佈了24 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章