天天看點

Spring架構的入門介紹1、Spring架構的概述2、Spring架構的體系結構3、Spring架構的兩大核心4、Spring架構的優勢

文章目錄

  • 1、Spring架構的概述
  • 2、Spring架構的體系結構
  • 3、Spring架構的兩大核心
    • 3.1、IOC(Inverse of Control 控制反轉)
      • 3.1.1、DI(Dependency Injection,依賴注入)
    • 3.2、AOP(Aspect Oriented Programming 面向切面程式設計)
  • 4、Spring架構的優勢

1、Spring架構的概述

  Spring 是 2003 年興起的一個輕量級的 Java 開發架構,由 Rod Johnson 建立。它解決了業務邏輯層和其他各層的松耦合問題,并将面向接口的程式設計思想貫穿整個系統應用。簡單來說,Spring 是一個分層的 JavaSE/EE Full-Stack(一站式) 輕量級開源架構。

  官方網址:https://spring.io

  下載下傳位址:https://repo.spring.io/libs-release-local/org/springframework/spring

  那麼問題來了,為什麼說 Spring 是分層、一站式、輕量級的架構呢?

  (1)分層,JavaEE 經典的 MVC 三層結構為表現層、業務層、持久層。

功能 舉例
Web 表現層 負責頁面資料顯示、頁面跳轉排程。 JSP/Servlet、SpringMVC
Service 業務層 負責業務處理、功能邏輯和事務控制。 Service、JavaBean、EJB
Dao 持久層 負責資料存取和封裝,及與資料庫打交道。 JDBC、Hibernate、Mybatis

  (2)一站式,指 Spring 為JavaEE 的每一層都提供了解決方案,比如:

解決方案
Web 表現層 Struts1、Struts2、Spring MVC
Service 業務層 IoC 控制反轉、AOP 面向切面程式設計、事務控制
Dao 持久層 JdbcTemplate、HibernateTemplate、ORM 架構(對象關系映射)的整合

  (3)輕量級,指從大小與開銷兩方面而言,Spring都是輕量的。

  完整的 Spring 架構可以在一個大小隻有 1MB 多的 Jar 檔案裡釋出。并且 Spring 所需的處理開銷也是微不足道的。Spring 的出現解決了 EJB 臃腫、低效、繁瑣複雜、脫離現實的情況。而且使用 Spring 程式設計是非侵入式的。Spring 應用中的對象不依賴于 Spring 的特定類。

2、Spring架構的體系結構

  Spring 架構是一個分層架構,它包含一系列的功能要素,被分為大約20個子產品。這些子產品分為 Core Container、Data Access/Integration、Web、AOP、Aspects、Instrumentation 和 Test,如下圖所示:

Spring架構的入門介紹1、Spring架構的概述2、Spring架構的體系結構3、Spring架構的兩大核心4、Spring架構的優勢

  核心容器(Core Container)包括 Core、Beans、Context、EL 子產品:

  (1)Core 和 Beans 子產品提供了 Spring 最基礎的功能,Core 子產品是核心,為其他子產品提供支援,包括 Spring 的核心工具類。Beans 是 Spring 管理實體類 Bean 的主要子產品,提供 IoC 控制反轉和依賴注入 DI。控制反轉即将控制權由原來的程式員自己管理交給 Spring 來管理,依賴注入就是注入對象執行個體,有四種方式,即接口注入、setter 方法注入、構造器注入和注解注入。

  (2)Context 上下文子產品,主要基于 Core 和 Beans 子產品 Context 子產品的 Context 包繼承了 Beans 包的功能,還增加了國際化(I18N)、事件傳播等,Context 上下文子產品,還包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。

  (3)Expression Language,表達式語言子產品,又稱 SpEL,提供了在運作期間查詢和操作對象圖的強大能力。包含五個主要特性:①使用 Bean 的 ID 引用 Bean;②調用方法和通路對象的屬性;③對值進行算術,關系和邏輯運算;④正規表達式比對;⑤集合操作。

3、Spring架構的兩大核心

  Spring 兩大核心分别為 IOC(Inverse of Control 控制反轉)和 AOP(Aspect Oriented Programming 面向切面程式設計)。

3.1、IOC(Inverse of Control 控制反轉)

  簡單來說,IOC 就是将對象的建立權利交給 Spring 工廠進行管理。比如說原來我們建立對象的方法是:

  使用 IOC 後可以這樣寫:

  其中,控制反轉還包括了 DI(Dependency Injection,依賴注入)和DL(Dependency Lookup,依賴查找)。

3.1.1、DI(Dependency Injection,依賴注入)

  依賴注入是指在 Spring 架構建立 Bean 對象時,動态地将依賴對象注入到 Bean 元件。簡單的說,就是将另外一個 Bean 對象動态地注入到另一個 Bean 中。

  依賴注入的做法:由 Spring 容器建立 Service、Dao 對象,并且通過注解或配置将 Dao 傳入Servcie,那麼 Service 對象就包含了 Dao 對象的引用。比如:

@Service
public class UserServiceImpl implements UserService {
	@Autowired //通過注解注入UserMapper對象
	private UserMapper userMapper;
	...
}
           

3.2、AOP(Aspect Oriented Programming 面向切面程式設計)

  AOP 采取橫向抽取機制,取代了傳統縱向繼承體系重複性代碼的編寫方式(例如性能監視、事務管理、安全檢查、緩存、日志記錄等)。

  AOP 基于代理思想,對原來目标對象,建立代理對象,在不修改原對象代碼情況下,通過代理對象,調用增強功能的代碼,進而對原有業務方法進行增強。例如可以在插入 User 對象之前進行列印日志,請看下面的代碼示例。

  UserService.java:

public interface UserService {
	void add(User user);
}
           

  前置增強類 PrintLogBefore.java:

//前置增強代碼
public class PrintLogBefore implements MethodBeforeAdvice {
	private static final Logger log = Logger.getLogger(PrintLogBefore.c
	lass);
	@Override
	public void before(Method method, Object[] arguments, Object target) throws Throwable {
		log.info("在插入User之前執行的方法");
 	}
 }
           

  最後配置切入點:

<bean id="printBefore" class="com.atlantis.aop.test.PrintLogBefore"></bean>
<aop:config>
	<aop:pointcut expression="execution(public void save(com.atlantis.aop.domain.User))" id="pointcut"/>
	<aop:advisor advice-ref="printBefore" pointcut-ref="pointcut"/>
</aop:config>
           

  這樣在調用 add(User user) 方法之前就會執行前置增強類

PrintLogBefore.java

before()

方法。

4、Spring架構的優勢

  (1)友善解耦,簡化開發。通過 Spring 提供的 IoC 容器,可以将對象間的依賴關系交由 Spring 進行控制,避免寫死所造成的過度程式耦合。使用者也不必再為單例模式類、屬性檔案解析等這些很底層的需求編寫代碼,可

以更專注于上層的應用。

  (2)AOP 程式設計的支援。通過 Spring 的 AOP 功能,友善進行面向切面的程式設計,許多不容易用傳統 OOP 實作的功能可以通過 AOP 輕松應付。

  (3)聲明式事務的支援。可以将我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理,提高開發效率和品質。

  (4)友善程式的測試。可以用非容器依賴的程式設計方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是随手可做的事情。

  (5)友善內建各種優秀架構。Spring 可以降低各種架構的使用難度,提供了對各種優秀架構(Struts、Hibernate、Hessian、Quartz等)的直接支援。

  (6)降低 JavaEE API 的使用難度。Spring 對 JavaEE API(如 JDBC、JavaMail、遠端調用等)進行了薄薄的封裝層,使這些 API 的使用難度大為降低。

  (7)Java 源碼是經典學習範例。Spring 的源代碼設計精妙、結構清晰、匠心獨用,處處展現着大師對 Java 設計模式靈活運用以及對 Java 技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的範例。