溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring及相關(guān)框架知識(shí)小匯

發(fā)布時(shí)間:2020-07-01 02:58:40 來源:網(wǎng)絡(luò) 閱讀:799 作者:yinshuai875160 欄目:數(shù)據(jù)庫


  一 Spring相關(guān)知識(shí)介紹

   簡(jiǎn)單點(diǎn)說,Spring是一個(gè)分層的JavaSE/EE 一站式輕量級(jí)的開源框架。Spring致力于提供一種方法來管理你的業(yè)務(wù)對(duì)象。Spring致力于J2EE應(yīng)用的各層解決方案,而不是僅僅專注于某一層的方案,可以說Spring是企業(yè)應(yīng)用的一站式選擇,貫穿于表現(xiàn)層,業(yè)務(wù)層和持久層。然而,spring并不想取代它們,而是與它們無縫整合。

控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了低耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過被動(dòng)的方式傳遞進(jìn)來,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。

面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。

容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。

框架——Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。

MVC—Spring的作用是整合,但不僅僅限于整合,Spring 框架可以被看做是一個(gè)企業(yè)解決方案級(jí)別的框架。客戶端發(fā)送請(qǐng)求,服務(wù)器控制器(由DispatcherServlet實(shí)現(xiàn)的)完成請(qǐng)求的轉(zhuǎn)發(fā),控制器調(diào)用一個(gè)用于映射的類HandlerMapping,該類用于將請(qǐng)求映射到對(duì)應(yīng)的處理器來處理請(qǐng)求。HandlerMapping將請(qǐng)求映射到對(duì)應(yīng)的處理器Controller(相當(dāng)于Action)在Spring 當(dāng)中如果寫一些處理器組件,一般實(shí)現(xiàn)Controller 接口,在Controller 中就可以調(diào)用一些Service 或DAO 來進(jìn)行數(shù)據(jù)操作, ModelAndView 用于存放從DAO 中取出的數(shù)據(jù),還可以存放響應(yīng)視圖的一些數(shù)據(jù)。 如果想將處理結(jié)果返回給用戶,那么在Spring框架中還提供一個(gè)視圖組件ViewResolver,該組件根據(jù)Controller返回的標(biāo)示,找到對(duì)應(yīng)的視圖,將響應(yīng)response 返回給用戶。

 

視圖是一個(gè)接口,負(fù)責(zé)顯示模型;控制器表示邏輯代碼,是Controller的實(shí)現(xiàn)。

 

IOC和AOP

控制反轉(zhuǎn)模式(也稱作依賴性注入)的基本概念是:不創(chuàng)建對(duì)象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對(duì)象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器 (在Spring 框架中是 IOC 容器) 負(fù)責(zé)將這些聯(lián)系在一起。在典型的 IOC 場(chǎng)景中,容器創(chuàng)建了所有對(duì)象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了 IOC 的一個(gè)實(shí)現(xiàn)模式。

 

Spring的基本框架:

Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式。組成Spring框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:

1、核心容器:核心容器提供 Spring 框架的基本功能(SpringCore)。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。

2、Spring 上下文:Spring 上下文是一個(gè)配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如JNDI、EJB、電子郵件、國際化、校驗(yàn)和調(diào)度功能。

3、Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。

4、Spring DAO:JDBCDAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。

5、Spring ORM:Spring 框架插入了若干個(gè)ORM框架,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括JDO、HibernateiBatisSQLMap。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。

6、Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring框架支持與 Jakarta Struts 的集成。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο?/span>的工作。

7、Spring MVC 框架:MVC框架是一個(gè)全功能的構(gòu)建 Web應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過策略接口,MVC框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean構(gòu)成,存放于Map;視圖是一個(gè)接口,負(fù)責(zé)顯示模型;控制器表示邏輯代碼,是Controller的實(shí)現(xiàn)。


DI的注解形式:

    注解的作用和特性:

1、  起到了一個(gè)解釋說明的作用

2、  注解是不能單獨(dú)存在的

3、  注解應(yīng)該標(biāo)在:類,方法,屬性,參數(shù)等

4、  應(yīng)該有一個(gè)類:該類起的作用是解釋說明

 

1.1  利用注解的步驟

public class Person {

    @Resource

    private Student student;

    public void say(){

        this.student.student();

    }

}

 

注意:@Resource注解

 

在spring的配置文件中

要導(dǎo)入命名

xmlns:context=http://www.springframework.org/schema/context

http://www.springframework.org/schema/context   

           http://www.springframework.org/schema/context/spring-context-3.0.xsd

啟動(dòng)注解解析器

<context:annotation-config></context:annotation-config>

1.2  原理

1、  當(dāng)啟動(dòng)spring容器的時(shí)候,容器實(shí)例化了person和student

2、  當(dāng)spring容器解析到

<context:annotation-config></context:annotation-config>的時(shí)候,spring容器會(huì)對(duì)spring容器范圍的bean進(jìn)行掃描,檢查哪些bean的哪些屬性

上有@Resource注解

3、  檢查到了該注解的時(shí)候,檢查@Resource注解的name屬性的值是否為””

如果是空

     拿注解所在的屬性的名稱和spring配置文件中的bean中的id的值做匹配

     如果匹配成功,則賦值

     如果匹配不成功,則按照類型進(jìn)行匹配

     如果類型也不匹配,肯定報(bào)錯(cuò)

如果不為空

     會(huì)提取到name屬性的值,根據(jù)這個(gè)值,和spring容器中的id做匹配

     如果匹配不成功,則報(bào)錯(cuò)

 

 2.     類掃描機(jī)制

2.1.  步驟

1、   在spring配置文件中

    <context:component-scanbase-package="cn.tedu.big1603.spring.scan.annotation">          </context:component-scan>

    2、   在相應(yīng)的類中

       @Component

    publicclass Person {}

    ==

    <beanid=”person” class=”…Person”

     

    @Component("p")

    publicclass Person {}

        ==

        <bean id=”p”class=”…Person”>

 

2.2.  原理

1、   當(dāng)spring容器啟動(dòng)的時(shí)候,會(huì)解析到<context:component-scanbase-package="cn.tedu.big1603.spring.scan.annotation"></context:component-scan>

2、   會(huì)去base-package指定的包及子包中查找,查看哪個(gè)類上面加有@Compontent注解

3、   會(huì)檢查該注解的value屬性是否為””

如果為“”

    會(huì)創(chuàng)建一個(gè)bean對(duì)象,bean對(duì)象的id的值就是類名的組成,組成規(guī)則

        為首字母小寫,其他不變

如果不為“”

    Value屬性的值就是id的值

4、   上述步驟完事以后,在spring容器中有對(duì)象了。

5、   掃描所有的在spring容器中的bean,進(jìn)行@Resouce注入的業(yè)務(wù)邏輯

2.3.  總結(jié)

     總共掃描了二次,第一次是把類放入到spring容器中,第二次是給屬性注入值,所以配置文件的內(nèi)容越少,效率越低,但是這個(gè)效率低對(duì)于web程序來說是可以忽略的。

2.4.  三種典型化注解

    @Repository

    @service

    @controller

    的作用和@Compontent的作用一樣

 

AOP相關(guān)知識(shí)介紹:

 

在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。

可以通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)地統(tǒng)一添加功能的一種技術(shù)。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。

 

在Spring中提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。

 

  AOP,我們可以定義交叉的關(guān)系,并將這些關(guān)系應(yīng)用于跨模塊的、彼此不同的對(duì)象模型。


動(dòng)態(tài)代理:所謂Dynamic Proxy是這樣一種class:它是在運(yùn)行時(shí)生成的class,在生成它時(shí)你必須提供一組interface給它,然后該class就宣稱它實(shí)現(xiàn)了這些 interface。你當(dāng)然可以把該class的實(shí)例當(dāng)作這些interface中的任何一個(gè)來用。當(dāng)然啦,這個(gè)Dynamic Proxy其實(shí)就是一個(gè)Proxy,它不會(huì)替你作實(shí)質(zhì)性的工作,在生成它的實(shí)例時(shí)你必須提供一個(gè)handler,由它接管實(shí)際的工作。

注意事項(xiàng):目標(biāo)對(duì)象和代理對(duì)象實(shí)現(xiàn)了同一個(gè)接口.


動(dòng)態(tài)代理模式實(shí)現(xiàn)該邏輯的缺點(diǎn):

        在方法判斷的時(shí)候,如果是生產(chǎn)環(huán)境,如果方法特別多,這里的判斷就相當(dāng)多

        在該類中只處理了事務(wù),如果有權(quán)限、日志等內(nèi)容怎么辦呢?

總結(jié)

    動(dòng)態(tài)代理實(shí)現(xiàn)該邏輯也不是最好的選擇

 

二 MyBatis框架知識(shí):


     MyBatis是支持普通 SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。

 

每個(gè)MyBatis應(yīng)用程序主要都是使用SqlSessionFactoryc創(chuàng)建實(shí)例的,一個(gè)SqlSessionFactory實(shí)例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個(gè)xml配置文件或者一個(gè)預(yù)定義的配置類的實(shí)例獲得。

用xml文件構(gòu)建SqlSessionFactory實(shí)例是非常簡(jiǎn)單的事情。推薦在這個(gè)配置中使用類路徑資源(Classpathresource),但你可以使用任何Reader實(shí)例,包括用文件路徑或file://開頭的url創(chuàng)建的實(shí)例。MyBatis有一個(gè)實(shí)用類----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。

功能架構(gòu)講解:

我們把Mybatis的功能架構(gòu)分為三層:

(1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。

(2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫操作。

(3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

 

MyBatis框架架構(gòu)講解:

(1)加載配置:配置來源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。

(2)SQL解析:當(dāng)API接口層接收到調(diào)用請(qǐng)求時(shí),會(huì)接收到傳入SQL的ID和傳入對(duì)象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會(huì)根據(jù)SQL的ID找到對(duì)應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對(duì)象對(duì)MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。


(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。

(4)結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。


MyBatis 最強(qiáng)大的特性之一就是它的動(dòng)態(tài)語句功能。如果您以前有使用JDBC或者類似框架的經(jīng)歷,您就會(huì)明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個(gè)逗號(hào)等。動(dòng)態(tài)語句能夠完全解決掉這些痛苦。
  盡管與動(dòng)態(tài)SQL一起工作不是在開一個(gè)party,但是MyBatis確實(shí)能通過在任何映射SQL語句中使用強(qiáng)大的動(dòng)態(tài)SQL來改進(jìn)這些狀況。動(dòng)態(tài)SQL元素對(duì)于任何使用過JSTL或者類似于XML之類的文本處理器的人來說,都是非常熟悉的。在上一版本中,需要了解和學(xué)習(xí)非常多的元素,但在MyBatis 3 中有了許多的改進(jìn),現(xiàn)在只剩下差不多二分之一的元素。MyBatis使用了基于強(qiáng)大的OGNL表達(dá)式來消除了大部分元素。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI