Spring 簡介 是一個輕量級的 Java 開發框架,它是為瞭解決企業應用開發的複雜性而創建的。 的核心是控制反轉( )和麵向切麵編程( )。簡單來說, 是一個分層的 一站式輕量級開源框架。 的主要作用就是為代碼 解耦 ,降低代碼間的耦合度。 在一個系統中,根據功能的不同,代碼分為 主業務邏輯 與 ...
Spring 簡介
Spring
是一個輕量級的 Java 開發框架,它是為瞭解決企業應用開發的複雜性而創建的。Spring
的核心是控制反轉(IoC
)和麵向切麵編程(AOP
)。簡單來說,Spring
是一個分層的 Java EE
一站式輕量級開源框架。
Spring
的主要作用就是為代碼 解耦,降低代碼間的耦合度。
在一個系統中,根據功能的不同,代碼分為 主業務邏輯 與 系統級業務邏輯 兩類。它們各自具有鮮明的特點:主業務代碼間邏輯聯繫緊密,有具體的專業業務應用場景,復用性相對較低;系統級業務相對功能獨立,沒有具體的專業業務應用場景,主要是為主業務提供系統級服務,如日誌、安全、事務等,復用性強。
Spring
根據代碼的功能特點,將降低耦合度的方式分為了以下兩類。
IoC
:使得主業務在相互調用過程中,不用再自己維護關係了,即不用再自己創建要使用的對象了,而是由Spring
容器統一管理,實現自動 註入。AOP
:使得系統級服務得到了最大復用,且不用再手工將系統級服務混雜到主業務邏輯中了,而是由Spring
容器統一完成 織入。
Spring 體繫結構
Spring
由 20 多個模塊組成,它們可以分為數據訪問/集成(Data Access/Integration)、Web、面向切麵編程(AOP, Aspects)、應用伺服器設備管理(Instrumentation)、消息發送(Messaging)、核心容器(Core Container)和測試(Test)。
Spring 的特點
非侵入式
所謂非侵入式是指,Spring
框架的 API 不會在業務邏輯上出現,即業務邏輯是 POJO。由於業務邏輯中沒有 Spring 的 API,所以業務邏輯可以從 Spring
框架快速的移植到其他框架, 即與環境無關。
容器
Spring
作為一個容器,可以管理對象的生命周期、對象與對象之間的依賴關係。可以通過配置文件,來定義對象,以及設置與其他對象的依賴關係。
控制反轉(IoC)
控制反轉(Inversion of Control),即創建被調用者的實例不是由調用者完成,而是由 Spring
容器完成,並註入調用者。一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。即,不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
面向切麵編程(AOP)
面向切麵編程(Aspect Orient Programming),是一種編程思想,是面向對象編程 OOP
的補充。允許通過分離應用的業務邏輯與系統級服務(例如日誌和事務管理)進行開發。開發者只要專註實現業務邏輯,並不需要負責其它的系統級關註點,例如日誌或事務支持。
Spring 核心 IoC
控制反轉的核心功能在於通過將程式代碼獲取對象調用權,來實現對象的裝配和管理。控制反轉就是對對象控制權的轉移,從程式代碼本身反轉到了外部容器。
當前比較流行的實現方式有兩種: 依賴註入和依賴查找,依賴註入方式應用更為廣泛。
- 依賴查找(DL):Dependency Lookup,容器提供回調介面和上下文環境給組件,程式代碼則需要提供具體的查找方式。
- 依賴註入(DI):Dependency Injection,指程式運行過程中,若需要調用另一個對象協助時,無須在代碼中創建被調用者,而是依賴於外部容器,由外部容器創建後傳遞給程式。
依賴註入是目前最優秀的解耦方式。依賴註入讓 Spring 的 Bean 之間以配置文件的方式組織在一起,而不是以硬編碼的方式耦合在一起的。
第一個 Spring 程式
引入依賴
在 pom.xml
中引入 Spring
核心依賴 org.springframework:spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.15.RELEASE</version>
</dependency>
業務代碼
創建 HiSpringService
業務介面
public interface HelloSpringService {
public void helloSpring();
}
創建實現類
public class HelloSpringService implements HelloSpringServiceImpl {
public void helloSpring() {
System.out.println("Hello Spring");
}
}
相關配置
在 src/main/resources
目錄下創建 spring-context.xml
配置文件,從現在開始類的實例化工作交給 Spring 容器管理(IoC),配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
<bean id="helloSpringService" class="com.antoniopeng.hello.spring.service.impl.HelloSpringServiceImpl" />
</beans>
bean
:用於定義一個實例對象。一個實例對應一個bean
元素。id
:該屬性是Bean
實例的唯一標識,程式通過 id 屬性訪問Bean,Bean 與 Bean 間的依賴關係也是通過 id 屬性關聯的。class
:指定該Bean
所屬的類,註意這裡只能是類,不能是介面。
使用 Spring IoC
創建一個 IoCTest
測試類,測試對象是否能夠通過 Spring
來創建,代碼如下:
public class IoCTest {
public static void main(String[] args) {
// 獲取 Spring 容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
// 從 Spring 容器中獲取對象
HelloSpringService helloSpringService = (HelloSpringService) applicationContext.getBean("HelloSpringService");
HelloSpringService.helloSpring();
}
}
- 文章作者:彭超
- 本文首發於個人博客:https://antoniopeng.com/2019/03/12/java/%E4%B8%80%E7%AB%99%E5%BC%8F%E8%BD%BB%E9%87%8F%E7%BA%A7%E6%A1%86%E6%9E%B6%20Spring/
- 版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 彭超 | Blog!