Spring
是一個輕量級的 Java 開發框架,它是爲了解決企業應用開發的複雜性而建立的。Spring
的核心是控制反轉(IoC
)和麪向切面編程(AOP
)。簡單來講,Spring
是一個分層的 Java EE
一站式輕量級開源框架。java
Spring
的主要做用就是爲代碼 解耦,下降代碼間的耦合度。spring
在一個系統中,根據功能的不一樣,代碼分爲 主業務邏輯 與 系統級業務邏輯 兩類。它們各自具備鮮明的特色:主業務代碼間邏輯聯繫緊密,有具體的專業業務應用場景,複用性相對較低;系統級業務相對功能獨立,沒有具體的專業業務應用場景,主要是爲主業務提供系統級服務,如日誌、安全、事務等,複用性強。編程
Spring
根據代碼的功能特色,將下降耦合度的方式分爲了如下兩類。安全
IoC
:使得主業務在相互調用過程當中,不用再本身維護關係了,即不用再本身建立要使用的對象了,而是由 Spring
容器統一管理,實現自動 注入。AOP
:使得系統級服務獲得了最大複用,且不用再手工將系統級服務混雜到主業務邏輯中了,而是由 Spring
容器統一完成 織入。Spring
由 20 多個模塊組成,它們能夠分爲數據訪問/集成(Data Access/Integration)、Web、面向切面編程(AOP, Aspects)、應用服務器設備管理(Instrumentation)、消息發送(Messaging)、核心容器(Core Container)和測試(Test)。服務器
所謂非侵入式是指,Spring
框架的 API 不會在業務邏輯上出現,即業務邏輯是 POJO。因爲業務邏輯中沒有 Spring 的 API,因此業務邏輯能夠從 Spring
框架快速的移植到其餘框架, 即與環境無關。app
Spring
做爲一個容器,能夠管理對象的生命週期、對象與對象之間的依賴關係。能夠經過配置文件,來定義對象,以及設置與其餘對象的依賴關係。框架
控制反轉(Inversion of Control),即建立被調用者的實例不是由調用者完成,而是由 Spring
容器完成,並注入調用者。一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。即,不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。測試
面向切面編程(Aspect Orient Programming),是一種編程思想,是面向對象編程 OOP
的補充。容許經過分離應用的業務邏輯與系統級服務(例如日誌和事務管理)進行開發。開發者只要專一實現業務邏輯,並不須要負責其它的系統級關注點,例如日誌或事務支持。編碼
控制反轉的核心功能在於經過將程序代碼獲取對象調用權,來實現對象的裝配和管理。控制反轉就是對對象控制權的轉移,從程序代碼自己反轉到了外部容器。spa
當前比較流行的實現方式有兩種: 依賴注入和依賴查找,依賴注入方式應用更爲普遍。
依賴注入是目前最優秀的解耦方式。依賴注入讓 Spring 的 Bean 之間以配置文件的方式組織在一塊兒,而不是以硬編碼的方式耦合在一塊兒的。
在 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
所屬的類,注意這裏只能是類,不能是接口。建立一個 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(); } }