最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一篇告訴你什么是Spring

2021-01-16 11:50 作者:JavaPub  | 我要投稿

閱讀全文大概需要7分鐘

前言

大多數(shù)文章講"什么到Spring?"上來就是控制反轉(zhuǎn)(IoC)或依賴注入(DI)和面向切面編程(AOP),拿著官網(wǎng)文檔直譯 copy。對小白來說并不友好,看完可能還是一頭霧水。下面是我利用業(yè)余時(shí)間整理的一些資料、書籍和自己的理解,致力于更容易理解方式講 Spring。


  • 前言

  • 什么是Spring ?

  • Spring 模塊

  • Spring的優(yōu)點(diǎn)

  • 我對 Spring IoC 和 AOP 理解

    • IoC(Inversion of Control)控制反轉(zhuǎn)

    • AOP(Aspect-OrientedProgramming)面向切面編程

  • Spring 的 bean

    • bean 的作用域有哪些 ?

    • Spring bean 單例與線程安全問題

    • Spring bean 的生命周期

    • 談?wù)剬?Spring MVC 的理解

  • Spring 事務(wù)聲明

    • 比較重要的一點(diǎn)是

  • 后記


什么是Spring ?

Spring 是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級的Java 開發(fā)框架,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的??蚣艿闹饕獌?yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。

然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。簡單來說,Spring 是一個(gè)分層的 JavaSE/EE full-stack(一站式) 輕量級開源框架。

簡單來說,它是一個(gè)容器框架,用來裝 javabean(java對象),中間層框架(萬能膠)可以起一個(gè)連接作用,比如說把 Struts 和 hibernate 粘合在一起運(yùn)用。簡單來說,Spring 是一個(gè)輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。

如果你現(xiàn)在還有點(diǎn)疑惑,通讀全文,你一定有所收獲

Spring 模塊

以下內(nèi)容都是基于 Spring 4 及以上的

Spring 官網(wǎng)圖片

  • Spring Core:Spring核心模塊,主要提供 ioC 依賴注入、

  • Spring Context:向Spring框架提供上下文信息、

  • Spring AOP:面向切面編程,為基于 Spring 的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)、

  • Spring JDBC:Java數(shù)據(jù)庫連接、

  • Spring JMS:Java消息服務(wù)、

  • Spring ORM:用于支持 MyBatis、Hibernate 等 ORM 工具、

  • Spring Web:為創(chuàng)建Web應(yīng)用程序提供支持、

  • Spring Test:提供了對 JUnit 和 TestNG 測試的支持、

  • Spring Aspects:該模塊為與AspectJ的集成提供支持。

  • Spring Web:Spring框架支持與Struts集成,為基于web的應(yīng)用程序提供了上下文。

Spring的優(yōu)點(diǎn)

  • 方便解耦,簡化開發(fā) (高內(nèi)聚低耦合)

Spring就是一個(gè)大工廠(容器),可以將所有對象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理,spring工廠是用于生成bean

  • AOP編程的支持

Spring提供面向切面編程,可以方便的實(shí)現(xiàn)對程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能

  • 聲明式事務(wù)的支持

只需要通過配置就可以完成對事務(wù)的管理,而無需手動編程

  • 方便程序的測試

Spring對Junit4支持,可以通過注解方便的測試Spring程序

  • 方便集成各種優(yōu)秀框架

Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

  • 降低JavaEE API的使用難度

Spring 對 JavaEE 開發(fā)中非常難用的一些 API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝,使這些 API 應(yīng)用難度大大降低

我對 Spring IoC 和 AOP 理解

Spring 中最重要的概念 IoC 和 AOP

IoC(Inversion of Control)控制反轉(zhuǎn)

IoC 需要 DI(依賴注入)的支持為什么呢?因?yàn)闆]有 DI 的注入 Spring 創(chuàng)造出的對象都是空值是無法使用的,所以說 IoCDI 多數(shù)是同時(shí)出現(xiàn)人們眼前的。

IOCInversion of Control 的縮寫,多數(shù)書籍翻譯成“控制反轉(zhuǎn)”。為了解決對象之間的耦合度過高的問題,軟件專家 Michael Mattson 提出了 IOC 理論,用來實(shí)現(xiàn)對象之間的解耦

2004年,Martin Fowler探討了同一個(gè)問題,既然IOC是控制反轉(zhuǎn),那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?”,經(jīng)過詳細(xì)地分析和論證后,他得出了答案:“獲得依賴對象的過程被反轉(zhuǎn)了”??刂票环崔D(zhuǎn)之后,獲得依賴對象的過程由自身管理變?yōu)榱擞?IOC 容器主動注入。于是,他給“控制反轉(zhuǎn)”取了一個(gè)更合適的名字叫做“依賴注入(Dependency Injection)”。他的這個(gè)答案,實(shí)際上給出了實(shí)現(xiàn) IOC 的方法:注入。所謂依賴注入,就是由IOC容器在運(yùn)行期間,動態(tài)地將某種依賴關(guān)系注入到對象之中。

依賴注入(DI)和控制反轉(zhuǎn)(IOC)是從不同的角度的描述的同一件事情,就是指通過引入 IOC 容器,利用依賴關(guān)系注入的方式,實(shí)現(xiàn)對象之間的解耦。

背景介紹完了,講講我的理解

IoC 就是依賴倒置原則的一種設(shè)計(jì)思路,就是將原本在程序中自己手動創(chuàng)建對象的控制權(quán),交由 Spring 框架來管理。Spring 框架負(fù)責(zé)控制對象的生命周期對象之間的關(guān)系。IoC 在其他語言中也有應(yīng)用,并非 Spirng 特有。ioc 容器實(shí)際上就是個(gè) map(key,value),里面存的是各種對象(在xml里配置的bean節(jié)點(diǎn)||repository、service、controller、component)。

Spring IOC 容器就像是一個(gè)工廠一樣,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)對象的時(shí)候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創(chuàng)建出來的。 IOC 容器負(fù)責(zé)創(chuàng)建對象,將對象連接在一起,配置這些對象,并從創(chuàng)建中處理這些對象的整個(gè)生命周期,直到它們被完全銷毀。

在實(shí)際項(xiàng)目中一個(gè) Service 類如果有幾百甚至上千個(gè)類作為它的底層,我們需要實(shí)例化這個(gè) Service,你可能要每次都要搞清這個(gè) Service 所有底層類的構(gòu)造函數(shù),這可能會把人逼瘋。如果利用 IOC 的話,你只需要配置好,然后在需要的地方引用就行了,這大大增加了項(xiàng)目的可維護(hù)性且降低了開發(fā)難度。

推薦閱讀:

https://www.zhihu.com/question/23277575/answer/169698662

IoC容器的初始化過程可以分為三步:

  1. Resource 定位(Bean的定義文件定位)、

  2. 將 Resource 定位好的資源載入到 BeanDefinition、

  3. 將 BeanDefiniton 注冊到容器中

IoC 源碼:

https://javadoop.com/post/spring-ioc

AOP(Aspect-OrientedProgramming)面向切面編程

什么是 AOP?

AOP(Aspect Oriented Programming 面向切面編程),在程序開發(fā)中主要用來解決一些系統(tǒng)層面上的問題,比如日志收集,事務(wù)管理,權(quán)限,緩存,對象池管理等。

AOP 可以說是 OOP(Object Oriented Programming,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。OOP 引入封裝、繼承、多態(tài)等概念來建立一種對象層次結(jié)構(gòu),用于模擬公共行為的一個(gè)集合。不過 OOP 允許開發(fā)者定義縱向的關(guān)系,但并不適合定義橫向的關(guān)系,例如日志功能。日志代碼往往橫向地散布在所有對象層次中,而與它對應(yīng)的對象的核心功能毫無關(guān)系對于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也都是如此,這種散布在各處的無關(guān)的代碼被稱為橫切(cross cutting),在 OOP 設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。

AOP技術(shù)恰恰相反,它利用一種稱為"橫切"的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護(hù)性。

Spring AOP

Spring AOP就是基于動態(tài)代理的,底層實(shí)現(xiàn)有倆種方式:一種是 JDK 動態(tài)代理(JDK Proxy),另一種是 CGLib(Code Generation Library(基于字節(jié)碼操作)) 的方式。

如果要被代理的對象是個(gè)實(shí)現(xiàn)類,那么 Spring 會使用 JDK動態(tài)代理來完成操作(Spirng 默認(rèn)采用JDK動態(tài)代理實(shí)現(xiàn)機(jī)制);如果要被代理的對象不是個(gè)實(shí)現(xiàn)類那么,Spring 會強(qiáng)制使用 CGLib 來實(shí)現(xiàn)動態(tài)代理。

推薦閱讀:https://www.jianshu.com/p/5b9a0d77f95f

當(dāng)然,也可以使用 AspectJ ,AspectJ 可以做Spring AOP干不了的事情,它是 AOP 編程的完全解決方案。

Spring AOP 和 AspectJ AOP 有什么區(qū)別?

Spring AOP 屬于運(yùn)行時(shí)增強(qiáng);而 AspectJ 是編譯時(shí)增強(qiáng)。Spring AOP 只能在運(yùn)行時(shí)織入,AspectJ 運(yùn)行時(shí)織入不可用,支持編譯時(shí)、編譯后和加載時(shí)織入。

AspectJ 相比于 Spring AOP 功能更加強(qiáng)大,但是 Spring AOP 相對來說更簡單。

Spring 的 bean

bean 的作用域有哪些 ?

Spring bean 單例與線程安全問題

線程安全一直是代碼編寫的重地,我們大多時(shí)候在系統(tǒng)開發(fā)中不會使用多線程。單例 bean 存在線程安全問題,當(dāng)多個(gè)線程操作同一個(gè)對象的時(shí)候,這個(gè)對象的非靜態(tài)成員變量會存在線程安全問題。

解決方法:

  1. 在類中定義一個(gè)ThreadLocal成員變量,將需要的可變成員變量保存在 ThreadLocal 中(推薦的一種方式,這也是常用一種);

2.在Bean對象中盡量避免定義可變的成員變量。

Spring bean 的生命周期

在傳統(tǒng)的Java應(yīng)用中,bean的生命周期很簡單,使用Java關(guān)鍵字 new 進(jìn)行Bean 的實(shí)例化,然后該Bean 就能夠使用了。一旦bean不再被使用,則由Java自動進(jìn)行垃圾回收。

相比之下,Spring管理Bean的生命周期就復(fù)雜多了,正確理解Bean 的生命周期非常重要。一個(gè)Bean的構(gòu)造過程:

談?wù)剬?Spring MVC 的理解

說到了 Spring ,那一定提一下 Spring MVC,各種講 SSM 的技術(shù)博客大家應(yīng)該都見了很多。

在我初學(xué)時(shí) Java,那時(shí)講的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 這種開發(fā)模式,這是早期的 JavaWeb MVC。

Spring MVC 是一款很優(yōu)秀的 MVC 框架??梢宰屛覀兊拈_發(fā)更簡潔,而且它和 Spring 是無縫集成,是 Spring 的一個(gè)子模塊,是我們上面提到 Spring 大家族中 Web 模塊。

Spring MVC 框架主要由 DispatcherServlet 、處理器映射、處理器(控制器)、視圖解析器、視圖組成。

Spring MVC 流程圖很重要:

Spring 事務(wù)聲明

事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。

  1. 編程式事務(wù),在代碼中硬編碼。(不推薦使用)

  2. 聲明式事務(wù),在配置文件中配置(推薦使用)

聲明式事務(wù)又分為兩種:

  1. 基于XML的聲明式事務(wù)

  2. 基于注解的聲明式事務(wù)

比較重要的一點(diǎn)是

@Transactional(rollbackFor = Exception.class)注解

@Transactional 注解中如果不配置 rollbackFor 屬性,那么事物只會在遇到 RuntimeException 的時(shí)候才會回滾,加上 rollbackFor=Exception.class ,可以讓事物在遇到非運(yùn)行時(shí)異常時(shí)也回滾。

后記

scope 是范圍的意思,在絕地求生中 scope 意為瞄準(zhǔn)鏡,如果你的隊(duì)友是個(gè)老外你就和他說 i want this 4times scope 他就明白了。

下篇結(jié)合代碼一塊講解

聲明:參考來源互聯(lián)網(wǎng),有任何爭議可以留言。站在前人的肩上,我們才能看的更遠(yuǎn)。

本教程純手打,致力于最實(shí)用教程,希望多多轉(zhuǎn)發(fā)支持,對我真的很重要。 歡迎來我公眾號,希望可以結(jié)識你,更多原創(chuàng)PDF,微信搜索:JavaPub,回復(fù):【666】,也可以催更。

有任何問題都可以來談?wù)?!

知識架構(gòu)


一篇告訴你什么是Spring的評論 (共 條)

分享到微博請遵守國家法律
赣榆县| 石渠县| 平湖市| 朝阳市| 广宗县| 图木舒克市| 吉安市| 尼玛县| 茶陵县| 玉溪市| 牙克石市| 招远市| 晴隆县| 乌拉特前旗| 荃湾区| 张家界市| 保定市| 连平县| 浮梁县| 贵阳市| 德保县| 鸡泽县| 阿尔山市| 旅游| 福泉市| 玉门市| 恩平市| 栖霞市| 宜兰县| 滁州市| 嘉兴市| 贡觉县| 昌都县| 新沂市| 晋城| 宜兰县| 乐山市| 曲麻莱县| 新干县| 康平县| 杭锦后旗|