文章目錄
- 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,如下圖所示:
核心容器(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 技術的最佳實踐的範例。