Spring 的簡介:
Spring 是一個輕量級的業務層框架,與之相關的還有Spring MVC(控制層)以及Mybitis(持久層框架),Spring框架主要是為了提高開發效率,以及解耦。為什么能提高開發效率和解耦,是因為Spring 里面的四個功能,以及它的核心理念(約定優於配置),接下來,我就以它的四個功能以及核心理念去闡述:
四個功能:IOC(控制反轉)/DI(依賴注入),AOP(面向切面編程),jdbcTemplate(Spring 利用AOP思想封裝的jdbc操作工具),事務
IOC(控制反轉)/DI(依賴注入):
1.什么是控制反轉,就是將New對象的權利交給了IOC容器,在沒有Spring之前,new對象的權利在我們自己的手中。
2. 那么這樣做有什么好處呢?在沒有控制反轉之前,如果我們要實現某個功能,需要ABC三個對象的相互協調,那么他們之間就是相互調用,如果一個對象改變的話,那么其他的要去改變,所以耦合度是非常高的,不易擴展,不易維護,不易測試。而IOC的思想的誕生就很好的解決了這些問題,首先我們不需要去管理對象的整個生命周期了,對象的管理交給了IOC容器,我們不需要關心他是如何管理的,只需要在我們要使用某個對象的時候告訴他,他將對象給我們。這也是面向對象思想的一個具體的實現,不需要關心對象是如何產生的,只需要關心我什么時候要用,然后告訴容器。
3.什么是依賴注入,依賴注入其實是IOC的另一個名字,和IOC是同一個概念,但是是從不同的角度去理解。那么要理解他的話,也很容易,首先是依賴,誰依賴誰:當然是應用程序依賴容器,為什么要依賴:應用程序需要容器提供對象需要的外部資源,誰注入誰:容器注入應用程序的某個對象,注入了什么:注入某個對象所需要的外部資源(常見的就是對象)
4.如何做(注入):
在做之前,我們要先了解一下,注入的是什么,上邊只是抽象的解釋了注入的是對象所需要的外部資源,那么具體是什么呢?“Bean”,在IOC容器中,Bean就相當於水,而容器相當於水桶,兩者缺一不可,誰也離不開誰,看過源碼后,就會覺得bean的定義其實很簡單,就是普通的pojo。接下來我們看一下Bean是如何獲取的。
5.Bean的獲取:當Bean被注入到Spring中后,獲取它只需要兩步,第一步加載配置文件,當配置文件被加載的時候,Spring 會初始化你剛注入的Bean,然后將它變成一個普通的POJO,第二步就是獲取Bean,獲取就很簡單了,pojo如何調用 ,想必已經很熟練了,構造方法中的get方法去獲取。
我們了解了如何獲取Bean,但在獲取之前我們需要先注入Bean,怎么注入呢?在這里,我只提供思路,具體的實現ctrl c v,其實也不需要記這些東西,如果有興趣的話,可以鑽研,也可以自己去實現,然后保存在GitHub上,什么時候需要了,什么時候克隆下載。
6.Bean的注入:注入的方式,xml注入,java配置,自動化掃描。我們一個一個看:
6.1:xml注入,屬性的注入,第一個是構造方法的注入,第一步:給Bean添加構造方法,第二步,在xml中注入,第二個set方法注入:這個比較簡單,和set方法給對象賦值一個道理。第三個是外部Bean的注入:外部bean的話,是沒有構造方法的,它的構造是通過Bulider來實現的,所以不能使用上邊的方式去注入,這里提供兩種方法,靜態工廠注入,和實例工廠注入。
復雜屬性的注入:注入方式和上邊的差不多,這里只簡單說一下都有什么注入,對象,數組,list,map,properties。
6.2:java配置:在Spring Boot之前,對於java的配置很少使用,但是Springboot之后,ava 配置開發被廣泛使用,因為在 Spring Boot 中,不使用一行 XML 配置。那么是如何配置的呢,首先首先在配置類上有一個 @Configuration 注解,它的作用就是告訴Spring,這不是一個普通類,而是一個注解類,這個類就相當於對spring的配置applicationContext.xml。然后定義一個方法,
方法上添加@Bean注解,相當於applicationContext.xml的Bean節點,方法返回對象,返回的對象就會被注入到容器中。Bean的名字默認就是方法民=名,如果想要自定義的話也可以,這就是Spring的約定大於配置的理念,你不說,就按照默認的來,比說了,就按照你說的配置就好了。
6.3:自動化配置:自動化配置既可以通過 Java 配置來實現,也可以通過 xml 配置來實現。我們日常工作中,大量使用自動化配置。具體的代碼請看我這篇博客,https://www.cnblogs.com/javazl/p/12553730.html 我只說一下常用的幾個類注解:
- 在 Service 層上,添加注解時,使用 @Service
- 在 Dao 層,添加注解時,使用 @Repository
- 在 Controller 層,添加注解時,使用 @Controller
- 在其他組件上添加注解時,使用 @Componen
自動掃描時的對象注入有三種方式:
- @Autowired(常用) 是根據類型去查找,然后賦值,這個類型只可以有一個對象。
- @Resources
- @Injected
添加完注解之后就要開始自動話掃描了:在項目啟動中加載配置類,在配置類中@ComponentScan 注解指定要掃描的包。
AOP(面向切面編程)
面向切面編程,其實是對面向對象編程的一種補充,他是一種思想,使得本不應該粘合在一起的功能分開,主要的功能就是再不改變源碼的基礎上,動態的增強方法的功能,目的是為了降低代碼的耦合度,從而達到容易維護和提高代碼的重用。它的設計思想來源於代理模式,在此基礎上對其進行封裝和擴展。使用代理對象,在不修改源碼的基礎上,直接在業務流程中切入新的代碼實現新的功能。比如日志(的輸入),(啟動數據庫)事務,對數據庫的操作。
在這些操作中,無一例外都是模板化的代碼 ,而AOP的特點就是解決模板化問題。
AOP中常見的幾個概念:
切點:要添加代碼的地方,成為切點。
通知(增強):向切點動態添加代碼。
切面:切點加通知(增強)
連接點:切點的定義。
Aop的實現:它的實現是基於java的動態代理,java的動態代理有兩種實現方式,cglib和jdk。
jdbcTemplate(Spring 利用AOP思想封裝的jdbc操作工具)
事務