SpringMVC---依賴注入與面向切面

一、依賴注入與面向切面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使用。

        一個經驗:設計良好的控制器自己只處理不多甚至不處理工做,而是將業務邏輯委託給一個或多個服務對象。

相關文章
相關標籤/搜索