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


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

我給自己設計的學習路線是這樣的:

  • 首先閱讀下Spring的官方文檔(注意,Spring官網上有很多項目,Spring的基礎框架是Spring FrameWork這個項目),記錄我認為重要的內容,方便后續回顧,到這邊對Spring會有基本的認識;
  • 然后找一到兩本關於Spring源碼的書,深入學習下Spring框架的原理性內容;
  • 最后對於Spring的關鍵特性我會單獨寫博客記錄,其實也就是對第二步的記錄,你看了源碼分析之后會對Spring的實現原理也有些了解。這些東西你不記錄的話會很快遺忘。而且在記錄學習過程中能加深對Spring設計思想的理解,將這些設計思想應用到我們自己的系統開發過程中才是我們學習一個框架的終極目標。

本博客是學習路線的第一步,是對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實現,基本已經能夠解決企業開發中對AOP 80%的需求。另外,Spring也提供了和AspectJ集成的功能。如果Spring的AOP實現不能滿足你的需求,可以考慮使用AspectJ。

依賴注入和控制反轉概念

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

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

在Spring框架中,IOC容器的功能主要由org.springframework.beansorg.springframework.context兩個包下面的代碼提供。BeanFactory接口提供基礎的IOC容器功能,ApplicationContext接口對其進行了擴展,擴展功能如下:

  • 更容易與Spring的AOP特性集成;
  • 消息資源處理(用於國際化)
  • 事件發布
  • 特定於應用程序層的上下文,比如web應用程序中使用的WebApplicationContext。

簡而言之,BeanFactory提供了配置框架和基本功能,而ApplicationContext添加了更多特定於企業的功能。ApplicationContext是BeanFactory的一個完整超集,在開發應用中我們更多的也是使用ApplicationContext這個接口。

Spring模塊

整個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.2.6.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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM