一、依賴注入與面向切面html
1.一、出現背景java
——如何簡化java開發?正則表達式
其中很重要的一點是「組件化」。數據庫
——如何更好的「組件化」?編程
鬆耦合,以及儘量的讓組件專一於自己。設計模式
——Spring框架的目的也只有一個,就是簡化java開發框架
1.2、耦合jsp
不少框架經過強迫應用繼承它們的類或實現它們的接口,從而讓應用和框架綁死。而耦合又是必須的,有協做關係的類之間一定存在耦合,因此重要的是保持鬆散耦合。函數
1.三、依賴注入DI(Dependency Injection)組件化
即利用第三方容器來管理類之間的耦合。在Spring中,對應的概念是Spring容器。它的設計思想主要是是反轉資源獲取的方向。
傳統的資源查找方式要求組件向容器發起請求查找資源,做爲迴應,容器適時的返回資源。而應用了 IoC 以後, 則是容器主動地將資源推送給它所管理的組件, 組件所要作的僅是選擇一種合適的方式來接受資源。總結來講,Spring 就是一個實現了IoC的容器。
1.四、面向切面AOP(Aspect Oriented Programming)
(1)橫切關注點:多個組件可能都須要用到的系統服務,如日誌、事務管理(與組件核心業務邏輯無關)。
(2)雙重複雜性:
a. 橫切關注點重複出如今多個組件中,修改和維護須修改各個模塊相關實現。
b. 組件由於這些與自身核心業務無關的代碼而變得混亂。
(3)切點:定義了何處(在程序執行過程當中的某個事件/方法)
(4)通知:定義了切面的事務,以及什麼時候執行(相對於切點先後/環繞)
(5)切面:切面由通知和切點組成,它在什麼時候何處完成什麼功能
(6)鏈接點:鏈接點是一個應用執行過程當中可以插入一個切面的點。
(7)織入: 織入是將切面應用到目標對象來建立的代理對象過程。
仔細地觀察上圖,在程序執行過程當中,能夠有多個的鏈接點,在這些鏈接點上,咱們即可以向其中插入切面(即你所想要插入的某個邏輯,這個邏輯,就是上面所說的橫切關注點),這樣咱們就能夠更好地理解下,什麼是AOP?在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
這樣的思想有什麼好處呢?試想一下,程序寫好了以後,你想要針對全部業務操做添加一個日誌,傳統的作法是,改造每一個業務方法,這樣勢必把代碼弄得一團糟,並且之後再擴展仍是更亂。而AOP的思想則是引導你從另外一個切面來看待和插入這個日誌,無論加在哪,它其實都是屬於日誌系統這個角度的。
舉個例子:
那麼,這樣說來,咱們也就懂得爲何會有AOP的思想,異曲同工,就是爲了下降咱們維護和開發程序的開銷,就是爲了簡化Java開發。
在這裏,咱們主要講的是Spring的編程思想,理解這種思想後,再進行實際操做也會駕輕就熟。
二、Bean的相關介紹
2.一、Bean的原理
Bean就至關於定義一個組件,這個組件是用於具體實現某個功能的,能夠重複使用。Bean的好處是:
(1)能夠沒必要再次編譯,就能夠工做在任何支持Java的平臺上。
(2)能夠以其餘組件模式工做。
(3)能夠在內部、網間和網內傳輸。
2.二、什麼是配置bean?
Spring幫咱們作的就是根據配置文件來建立Bean實例,並調用Bean實例的方法來完成「依賴注入」,能夠把Spring容器理解成一個大型工廠,Bean就是該工廠的產品,工廠(Spirng容器)裏能生產出來什麼樣的產品(Bean),徹底取決於咱們在配置文件中的配置。
2.三、那麼咱們該如何配置Bean呢?
Bean的配置形式,主要有如下2種:
(1)基於 XML文件的方式
(2)基於註解的方式(這點在下文會有詳細說明)
Bean的依賴注入方式,主要有如下3種:
(1)屬性注入方法
(2)構造函數注入方法
(3)工廠方法注入方法
屬性注入方法:屬性注入即經過setXXX()方法注入Bean的屬性值或者依賴對象
構造函數注入方法:構造函數注入方法保證一些必要的屬性在Bean實例化時就獲得了設置,並在實例化後就可使用。
【若是有多個構造器,能夠經過index和value進行更加精確的定位】
工廠方法注入方法(靜態工廠&實例工廠):即工廠類建立一個或多個工廠類實例,工廠類方法通常以接口或抽象類變量的形式返回目標類實例。不推薦使用。
2.四、 Bean的實例化
在Spring IoC 容器讀取 Bean 配置建立 Bean 實例以前, 必須對它進行實例化。Spring 提供了兩種類型的 IoC 容器實現:
(1)Bean工廠 BeanFactory: IoC 容器的基本實現。
(2)應用上下文 ApplicationContext:提供了更多的高級特性,是BeanFactory 的子接口。
BeanFactory 是 Spring 框架的基礎設施,面向 Spring 自己。而ApplicationContext面向使用 Spring 框架的開發者,幾乎全部的應用場合都直接使用ApplicationContext,而非底層的 BeanFactory。不管使用何種方式, 配置文件是相同的。
咱們看看下面的例子
而Bean的實例化還有一種形式,即基於註解的形式,這在下文會說起,也是一種較爲經常使用的方法。
2.五、Bean的自動裝配
自動裝配(經常使用)定義是隻聲明Bean, 而把Bean之間的關係交給 IoC 容器來完成。Spring IoC 容器能夠自動裝配Bean,咱們須要作的僅僅是在 <bean> 的 autowire 屬性裏指定自動裝配的模式。
(1)byType(根據類型自動裝配): 若IoC容器中有多個與目標Bean類型一致的 bean,在這種狀況下,Spring 將沒法斷定哪一個 bean 最合適該屬性,因此不能執行自動裝配。
(2)byName(根據名稱自動裝配): 必須將目標Bean的名稱和屬性名設置的徹底相同。
(3)constructor(經過構造器自動裝配): 當Bean中存在多個構造器時,此種自動裝配方式將會很複雜,不推薦使用。
(4)autodetect(自動檢測):若是constructor裝配失敗,則採用byType。
2.六、基於註解配置bean
組件掃描(component scanning): Spring 可以從 classpath 下自動掃描,偵測和實例化具備特定註解的組件。特定組件包括:
@Component: 基本註解, 標識了一個受 Spring 管理的組件
@Respository: 標識持久層組件
@Service: 標識服務層(業務層)組件
@Controller: 標識表現層組件
對於掃描到的組件, Spring 有默認的命名策略:使用非限定類名, 第一個字母小寫,也能夠在註解中經過 value 屬性值標識組件的名稱。
當在組件類上使用了特定的註解以後,還須要在 Spring 的配置文件中聲明<context:component-scan>,其中base-package 屬性指定一個須要掃描的基類包,Spring 容器將會掃描這個基類包裏及其子包中的全部類。就像這樣:
Spring 還支持 @Resource 和 @Inject 註解,這兩個註解和 @Autowired 註解的功用相似。@Resource 註解要求提供一個 bean 名稱的屬性,若該屬性爲空,則自動採用標註處的變量或方法名做爲 bean 的名稱。@Inject 和 @Autowired 註解同樣也是按類型匹配注入的 bean, 但沒有 reqired 屬性。建議讀者使用@Autowired 註解。
當 Spring 容器啓動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中全部 Bean,當發現 Bean 中擁有@Autowired 註釋時就找到和其匹配(默認按byType匹配)的 Bean,並注入到對應的地方中去。
固然,該實例也能夠自動裝配具備@Resource 、@Inject註解的屬性。它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。咱們能夠經過@Autowired的使用來消除 set ,get方法,以下圖的例子:
2.七、Spring表達式語言:SpEL
Spring 表達式語言(簡稱SpEL):是一個支持運行時查詢和操做對象圖的強大的表達式語言。
語法相似於 EL:SpEL 使用 #{…} 做爲定界符,全部在大框號中的字符都將被認爲是 SpEL,SpEL 爲bean 的屬性進行動態賦值提供了便利。
經過 SpEL 能夠實現:
(1)經過bean 的 id 對 bean 進行引用
(2)調用方法以及引用對象中的屬性
(3)計算表達式的值
(4)正則表達式的匹配
2.八、Bean在Spring中的地位
其實 Spring 就是面向 Bean 的編程(BOP,Bean Oriented Programming),Bean 在 Spring 中才是真正的主角。
Bean 在 Spring 中做用就像 Object 對 OOP(Object OrientedProgramming) 的意義同樣,沒有對象的概念就像沒有面向對象編程,Spring 中沒有 Bean 也就沒有 Spring 存在的意義。
Bean的生命週期:
(1)調用 Bean 的初始化方法,Bean 可使用了
(2)當容器關閉時, 會調用 Bean 的銷燬方法
三、SpringMVC調研流程
3.一、什麼是Spring MVC
MVC其實是一種設計模式
M表明model(模型)。模型表示企業數據和業務規則。被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能爲多個視圖提供數據。因爲應用於模型的代碼只需寫一次就能夠被多個視圖重用,因此減小了代碼的重複性。
V表明View(視圖)。視圖是用戶看到並與之交互的界面。如html,jsp等。
C表明Controller(控制器)。控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。因此當單擊Web頁面中的超連接和發送HTML表單時,控制器自己不輸出任何東西和作任何處理。它只是接收請求並決定調用哪一個模型構件去處理請求,而後用肯定用哪一個視圖來顯示模型處理返回的數據。
3.二、跟蹤Spring MVC的請求
首先控制器接收到用戶的請求,並決定應該調用哪一個模型來進行處理,而後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型返回的數據,並經過表示層呈現給用戶。
3.三、搭建Spring MVC
經過配置xml的形式
3.四、Spring MVC與數據庫的結合
(1)DAO(數據訪問對象)
DAO提供了數據讀取和寫入到數據庫中的一種方式,它們應該是以接口的方式發佈功能。
能夠經過Mybatis封裝數據操做,以下面的例子,實現了IUserDao中的insert接口,參數類型爲User,將User插入數據庫User表中
(2)Service(服務對象)
調用Dao的方法,實現咱們所須要的操做,供Controller使用。
一個經驗:設計良好的控制器自己只處理不多甚至不處理工做,而是將業務邏輯委託給一個或多個服務對象。