IOC和DI的概念,以及Spring框架的介紹

程式設計師自由之路 發表於 2020-06-30

對於Java開發者來說,Spring肯定是一個避不開的技術。所以準備系統的學下Spring框架。

我給自己設計的學習路線是這樣的:首先閱讀下Spring的官方文件(注意Spring官網上有很多專案,Spring的基礎框架是Spring FrameWork這個專案),記錄我認為重要的內容,方便後續回顧;到這邊對Spring已經有了基本的認識,然後是找一到兩本關於Spring原始碼的書,深入學習下Spring框架的原理性內容;最後是對於Spring的關鍵特性單獨寫部落格記錄,其實也就是對第二步的記錄,你看了原始碼分析之後會對Spring的實現原理也有些瞭解。這些東西你不記錄的話會很快遺忘。部落格是一個很好的記錄和分享自己所學的工具。所以後續我會對Spring的啟動過程、自動注入、AOP和Spring MVC這些我之前看起來很高階的特性單獨寫部落格記錄。

本部落格是學習路線的第一步,是對Spring官方文件的記錄。主要是熟悉Spring框架有哪些功能,基本的使用方式是怎樣的。由於Spring FrameWork的官方文件比較長,所以分模組來記錄了,本部落格是Spring FrameWork核心技術部分的記錄,基於5.2.6版本.關於這個版本相對於之前版本的更新,請點選連線檢視。


簡介

Spring是一個輕量級的Java Bean容器,這個容器為應用程式的開發提供了基礎框架(基礎功能)的支援,讓開發人員能夠關注業務邏輯的開發,大大了提升開發效率。Spring提供的基礎功能非常廣泛,包括核心的IOC、AOP、資源訪問、國際化、資料繫結和SpEL表示式,還有對Web的支援(Spring MVC),各種資料庫的支援(spring-data),以及對各種第三方框架整合的支援(spring-Integration)(jms、定時任務、郵件等)。

The Spring Framework is a Java platform that provides comprehensive infrastructure support for developing Java applications. Spring handles the infrastructure so you can focus on your application.

但是傳統的Spring應用開發有個弊端,就是配置過於繁瑣。為了簡化Spring應用程式的開發,現在Spring團隊推出了Spring Boot專案,支援自動配置,內嵌Web容器等核心功能,可以大大簡化Spring應用的開發。SpringBoot因此也越來越流行。對於越來越流行的微服務,Spring也提供了Spring Cloud解決方案。

本部落格覆蓋了Spring最重要的功能IOC和AOP。首先介紹IOC功能,講完IOC後會詳細講解AOP。Spring框架有它自己的AOP實現,基本已經能夠解決企業開發中對AOP80%的需求。另外,Spring也提供了和AspectJ整合的功能。如果Spring的AOP實現不能滿足你的需求,可以考慮使用AspectJ。

依賴注入和控制反轉概念

使用Spring必然會接觸到這兩個概念。

  • 控制反轉:物件建立的控制權由應用程式轉移到Spring容器。舉個例子:以前新建一個物件我們要在應用程式主動new一個物件,並給物件的屬性賦值,使用Spring的情況:容器負責物件的建立管理。
  • 依賴注入:所謂依賴注入,即元件之間的依賴關係由容器在執行期決定,形象的來說,即由容器動態的將某種依賴關係注入到元件之中。如果不使用IOC容器的話,可能需要我們通過建構函式在初始化類的時候注入(Spring的官方文件解釋:一個應用程式往往是由許多類組成的,那類和類之間又會有很多依賴關係。所謂依賴注入就是說Spring在初始化管理一個類的時候會同時將這個類依賴的類注入進入(初始化))

Spring模組

整個Spring框架被分成許多個小的模組,每個模組負責專門的功能。

IOC和DI的概念,以及Spring框架的介紹

Spring的整個IOC容器功能由spring-core, spring-beans, spring-context, springcontext-support,和spring-expression這幾個模組提供。

  • spring-core, spring-beans這兩個模組實現了最基本的IOC容器功能(IOC、依賴注入)。容器的基礎介面BeanFactory就是在這兩個模組中實現的;
  • spring-context和spring-context-support模組提供了ApplicationContext的實現,擴充套件了基礎容器的功能;
  • spring-expression:提供了對錶達式語言的支援;
  • spring-aop和spring-aspects:提供了對面向切面的支援;
  • spring-instrument和spring-instrument-tomcat:Spring對Web伺服器的支援;
  • spring-messaging,spring-jms:對資訊體系結構和協議的支援
  • spring-jdbc、spring-orm、spring-oxm、spring-tx、spring-jms:提供資料獲取方面的支援;
  • spring-web, spring-webmvc, spring-websocket, 和springwebmvc-portlet提供Web相關的支援;
  • spring-test提供測試相關支援。

Maven依賴

為了防止版本號混亂,Spring提供了簡便方式使用依賴

    <dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-framework-bom</artifactId>
				<version>5.1.3.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

    //在父pom中加入上面依賴後,就可以像下面這樣使用,不需要指定版本號
    <dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
	<dependencies>    

Spring日誌

Spring中使用JCL進行日誌輸出。熟悉JCL的人知道JCL只是一個日誌門面,我們可以自己選擇日誌實現框架。JCL預設的日誌實現框架是log4j,使用起來很方便,只需要加入下面的依賴並且在classpath下面加入log4j.properties就可以了。

<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>
</dependencies>

如果想使用Log4j 2.x作為日誌的實現框架,加入下面依賴,並且在classpath下加入log4j2.xml

<dependencies>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.6.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-jcl</artifactId>
		<version>2.6.2</version>
	</dependency>
</dependencies>

如果我們不想使用JCL作為日誌的門面,可以這樣新增依賴,這樣Spring框架中的日誌就會路由到SLF4J這個日誌門面中去了。

//使用slf4j作為日誌的門面,使用logback作為日誌的實現框架
<dependencies>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jcl-over-slf4j</artifactId>
		<version>1.7.21</version>
	</dependency>
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.1.7</version>
	</dependency>
</dependencies>