溫馨提示×

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

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

Spring的知識(shí)點(diǎn)有什么

發(fā)布時(shí)間:2022-01-12 09:22:54 來(lái)源:億速云 閱讀:160 作者:柒染 欄目:編程語(yǔ)言

Spring的知識(shí)點(diǎn)有什么,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

1. Spring框架的作用

輕量:Spring是輕量級(jí)的,基本的版本大小為2MB

控制反轉(zhuǎn):Spring通過(guò)控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合,對(duì)象們給出它們的依賴(lài),而不是創(chuàng)建或查找依賴(lài)的對(duì)象們。

面向切面的編程AOP:Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開(kāi)。

容器:Spring包含并管理應(yīng)用中對(duì)象的生命周期和配置

MVC框架: Spring-MVC

事務(wù)管理:Spring提供一個(gè)持續(xù)的事務(wù)管理接口,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)JTA

異常處理:Spring提供方便的API把具體技術(shù)相關(guān)的異常

2. Spring的組成

Spring的知識(shí)點(diǎn)有什么

Spring由7個(gè)模塊組成:

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

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

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

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

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

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

Spring MVC 框架:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過(guò)策略接口,MVC 框架變成為高度可配置的,MVC  容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。

3. Spring容器

Sping的容器可以分為兩種類(lèi)型

1.  BeanFactory:(org.springframework.beans.factory.BeanFactory接口定義)是最簡(jiǎn)答的容器,提供了基本的DI支持。最常用的BeanFactory實(shí)現(xiàn)就是XmlBeanFactory類(lèi),它根據(jù)XML文件中的定義加載beans,該容器從XML文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用。

2.  ApplicationContext應(yīng)用上下文:(org.springframework.context.ApplicationContext)基于BeanFactory之上構(gòu)建,并提供面向應(yīng)用的服務(wù)。

4. ApplicationContext通常的實(shí)現(xiàn)

ClassPathXmlApplicationContext:從類(lèi)路徑下的XML配置文件中加載上下文定義,把應(yīng)用上下文定義文件當(dāng)做類(lèi)資源。

FileSystemXmlApplicationContext:讀取文件系統(tǒng)下的XML配置文件并加載上下文定義。

XmlWebApplicationContext:讀取Web應(yīng)用下的XML配置文件并裝載上下文定義。

ApplicationContext context = new  ClassPathXmlApplicationContext("applicationContext.xml");

5. IOC & DI

Inversion of Control, 一般分為兩種類(lèi)型:依賴(lài)注入DI(Dependency Injection)和依賴(lài)查找(Dependency  Lookup).依賴(lài)注入應(yīng)用比較廣泛。

Spring IOC扶著創(chuàng)建對(duì)象,管理對(duì)象(DI),裝配對(duì)象,配置對(duì)象,并且管理這些對(duì)象的整個(gè)生命周期。

優(yōu)點(diǎn):把應(yīng)用的代碼量降到***。容器測(cè)試,最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)。IOC容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加載。

DI依賴(lài)注入是IOC的一個(gè)方面,是個(gè)通常的概念,它有多種解釋。這概念是說(shuō)你不用床架對(duì)象,而只需要描述它如何被創(chuàng)建。你不在代碼里直接組裝你的組件和服務(wù),但是要在配置文件里描述組件需要哪些服務(wù),之后一個(gè)IOC容器輔助把他們組裝起來(lái)。

IOC的注入方式:1. 構(gòu)造器依賴(lài)注入;2. Setter方法注入。

6. 如何給spring容器提供配置元數(shù)據(jù)

XML配置文件

基于注解的配置

基于Java的配置@Configuration, @Bean

7. bean標(biāo)簽中的屬性:

id

name

class

init-method:Bean實(shí)例化后會(huì)立刻調(diào)用的方法

destory-method:Bean從容器移除和銷(xiāo)毀前,會(huì)調(diào)用的方法

factory-method:運(yùn)行我們調(diào)用一個(gè)指定的靜態(tài)方法,從而代替構(gòu)造方法來(lái)創(chuàng)建一個(gè)類(lèi)的實(shí)例。

scope:Bean的作用域,包括singleton(默認(rèn)),prototype(每次調(diào)用都創(chuàng)建一個(gè)實(shí)例), request,session,  global-session(注意spring中的單例bean不是線(xiàn)程安全的)

autowired:自動(dòng)裝配 byName, byType, constructor,  autodetect(首先闡釋使用constructor自動(dòng)裝配,如果沒(méi)有發(fā)現(xiàn)與構(gòu)造器相匹配的Bean時(shí),Spring將嘗試使用byType自動(dòng)裝配)

8. beans標(biāo)簽中相關(guān)屬性

default-init-method

default-destory-method

default-autowire:默認(rèn)為none,應(yīng)用于Spring配置文件中的所有Bean,注意這里不是指Spring應(yīng)用上下文,因?yàn)槟憧梢远x多個(gè)配置文件

9. Bean的生命周期

1) 創(chuàng)建Bean的實(shí)例(factory-method, autowireConstrutor)

2) 屬性注入(autowireByName, autowireByType)

3) 初始化Bean

3.1 激活A(yù)ware方法:(invokeAwaresMethods)Spring中提供了一些Aware相關(guān)接口,比如BeanNameAware,  BeanFactoryAware,  ApplicationContextAware等,實(shí)現(xiàn)這些Aware接口的bean在被初始化之后,可以取得一些相對(duì)應(yīng)的資源。

private void invokeAwareMethods(final String beanName, final Object  bean){

if(bean instanceof Aware)

{

if(bean instanceof BeanNameAware){

((BeanNameAware) bean).setBeanName(beanName);

}

if(bean instanceof BeanClassLoaderAware){

((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());

}

if(bean instanceof BeanFactoryAware){

((BeanFactoryAware) bean).setBeanFactory(AbstactAutowire  CapableBeanFactory.this);

}

}

}

3.2  處理器的應(yīng)用(BeanPostProcessor接口):調(diào)用客戶(hù)自定義初始化方法前以及調(diào)用自定義初始化方法后分別會(huì)調(diào)用BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法,使用戶(hù)可以根據(jù)自己的業(yè)務(wù)需求進(jìn)行響應(yīng)的處理。3.3  激活自定義的init方法(init-method & 自定義實(shí)現(xiàn)InitializingBean接口)

protected Object initializeBean(final String beanName, final Object bean,  RootBeanDefinetion mbd){

if(System.getSecurityManager() != null){

AccessController.doPrivileged(new PrivilegedAction<Object>(){

@Override

public Object run()

{

invokeAwareMethods(beanName,bean);

return null;

}

});

}

else{

//對(duì)特殊的bean處理:Aware, BeanClassLoaderAware, BeanFactoryAware

invokeAwareMethods(beanName,bean);

}

Object wrappedBean = bean;

if(mbd == null !! !mbd.isSynthetic()){

wrappedBean =  applyBeanPostProcessorsBeforeInitialization(wappedBean,beanName);

}

try{

invokeInitMethods(beanName, wappedBean, mbd);

}

catch(Throwable ex){

throw new BeanCreationException((mbd != null ?  mbd.getResourceDescription():null),beanName,"Invocation of init method  failed",ex);

}

if(mbd == null || !mbd.isSynthetic()){

wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean,  beanName);

}

return wappedBean;

}

4) 使用Bean。 駐留在應(yīng)用的上下文中,直到該應(yīng)用上下文被銷(xiāo)毀。5) 銷(xiāo)毀(destory-mthod &  實(shí)現(xiàn)DisposableBean接口)

Or represent like this:

1. Bean的構(gòu)造

2. 調(diào)用setXXX()方法設(shè)置Bean的屬性

3. 調(diào)用BeanNameAware的setBeanName()

4. 調(diào)用BeanFactoryAware的setBeanFactory()方法

5. 調(diào)用BeanPostProcessor的postProcessBeforeInitialization()方法

6. 調(diào)用InitializingBean的afterPropertiesSet()方法

7. 調(diào)用自定義的初始化方法

8. 調(diào)用BeanPostProcessor類(lèi)的postProcessAfterInitialization()方法

9. 調(diào)用DisposableBean的destroy()方法

10. 調(diào)用自定義的銷(xiāo)毀方法

10. Spring中注入集合

<list>允許值相同

<set>不允許值相同

<map><entry key=”” value=”“></map>鍵和值都可以為任意類(lèi)型,key, key-ref,  value-ref, value可以任意搭配

<props><prop  key=”“>XXX</prop></props>鍵和值都只能是String類(lèi)型

11. 裝配空值

<property name="xxx"><null/></property>

12. 自動(dòng)裝配(autowiring)

有助于減少甚至消除配置<property>和<constructor-arg>元素,讓Spring自動(dòng)識(shí)別如何裝配Bean的依賴(lài)關(guān)系。<context:annotation-config/>與之對(duì)應(yīng)的是:自動(dòng)檢測(cè)(autodiscovery),比自動(dòng)裝配更近了一步,讓Spring能夠自動(dòng)識(shí)別哪些類(lèi)需要被配置成SpringBean,從而減少對(duì)<bean>元素的使用。<context:component-scan>

13. 注解

Spring容器默認(rèn)禁用注解裝配。最簡(jiǎn)單的開(kāi)啟方式<context:annotation-config/>。Spring支持的幾種不同的用于自動(dòng)裝配的注解:

Spring自帶的@Autowired注解

JSR-330的@Inject注解

JSR-250的@Resource注解

14. @Autowired

@Autowired具有強(qiáng)契約特征,其所標(biāo)注的屬性或參數(shù)必須是可裝配的。如果沒(méi)有Bean可以裝配到@Autowired所標(biāo)注的屬性或參數(shù)中,自動(dòng)裝配就會(huì)失敗,拋出NoSuchBeanDefinitionException.屬性不一定非要裝配,null值也是可以接受的。在這種場(chǎng)景下可以通過(guò)設(shè)置@Autowired的required屬性為false來(lái)配置自動(dòng)裝配是可選的,如:

@Autowired(required=false)

private Object obj;

注意required屬性可以用于@Autowired注解所使用的任意地方。但是當(dāng)使用構(gòu)造器裝配時(shí),只有一個(gè)構(gòu)造器可以將@Autowired的required屬性設(shè)置為true。其他使用@Autowired注解所標(biāo)注的構(gòu)造器只能將required屬性設(shè)置為false。此外,當(dāng)使用@Autowired標(biāo)注多個(gè)構(gòu)造器時(shí),Spring就會(huì)從所有滿(mǎn)足裝配條件的構(gòu)造器中選擇入?yún)⒆疃嗟哪莻€(gè)構(gòu)造器??梢允褂聾Qualifier明確指定要裝配的Bean.如下:

@Autowired

@Qualifier("objName")

private Object obj;

15. 自定義的限定器

@Target({ElementType.FIELF, ElementType.PARAMETER, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Qualifier

public @Interface SpecialQualifier{}

此時(shí),可以通過(guò)自定義的@SpecialQualifier注解來(lái)代替@Qualifier來(lái)標(biāo)注,也可以和@Autowired一起使用:

@Autowired

@SpecialQualifier

private Object obj;

此時(shí),Spring會(huì)把自動(dòng)裝配的范圍縮小到被@SpecialQualifier標(biāo)注的Bean中。如果被@SpecialQualifier標(biāo)注的Bean有多個(gè),我們還可以通過(guò)自定義的另一個(gè)限定器@SpecialQualifier2來(lái)進(jìn)一步縮小范圍。

16. @Autowired優(yōu)缺點(diǎn)

Spring的@Autowired注解是減少Spring XML配置的一種方式。但是它的類(lèi)會(huì)映入對(duì)Spring的特定依賴(lài)(即使依賴(lài)只是一個(gè)注解)。

17. @Inject

和@Autowired注解一樣,@Inject可以用來(lái)自動(dòng)裝配屬性、方法和構(gòu)造器;與@Autowired不同的是,@Inject沒(méi)有required屬性。因此@Inject注解所標(biāo)注的依賴(lài)關(guān)系必須存在,如果不存在,則會(huì)拋出異常。

18. @Named

相對(duì)于@Autowired對(duì)應(yīng)的Qualifier,@Inject所對(duì)應(yīng)的是@Named注解。

@Inject

@Named("objName")

private Object obj;

19. SpEL表達(dá)式

語(yǔ)法形式在#{}中使用表達(dá)式,如:

<property name="count" value="#{5}"/>

20. @Value

@Value是一個(gè)新的裝配注解,可以讓我們使用注解裝配String類(lèi)型的值和基本類(lèi)型的值,如int,  boolean。我們可以通過(guò)@Value直接標(biāo)注某個(gè)屬性,方法或者方法參數(shù),并傳入一個(gè)String類(lèi)型的表達(dá)式來(lái)裝配屬性,如:

@Value("Eruption")

private String song;

@Value可以配合SpEL表達(dá)式一起使用,譬如有些情況下需要讀取properties文件中的內(nèi)容,可以使用:

@Value("#{configProperties['ora_driver']}")

詳細(xì)可以參考 Spring+Mybatis多數(shù)據(jù)源配置(三)&mdash;&mdash;Spring如何獲取Properties文件的信息

21. 自動(dòng)檢測(cè)Bean

<context:component-scan>元素除了完成與<context:annotation-config>一樣的工作,還允許Spring自動(dòng)檢測(cè)Bean和定義Bean.<context:component-scan>元素會(huì)掃描指定的包和其所有子包,如下:

<context:component-scan base-package="com.zzh.dao" />

22. 為自動(dòng)檢測(cè)標(biāo)注Bean

默認(rèn)情況下,查找使用構(gòu)造型(stereotype)注解所標(biāo)注的類(lèi),這些特殊的注解如下:

- @Component:通用的構(gòu)造型注解,標(biāo)志此類(lèi)為Spring組件

- @Controller:標(biāo)識(shí)將該類(lèi)定義為SpringMVC controller

- @Repository:標(biāo)識(shí)將該類(lèi)定義為數(shù)據(jù)倉(cāng)庫(kù)

- @Service:標(biāo)識(shí)將該類(lèi)定義為服務(wù)

以@Component為例:

@Component

public class Guitar implements Intrument{}

這里@Component會(huì)自動(dòng)注冊(cè)Guitar 為Spring  Bean,并設(shè)置默認(rèn)的Bean的Id為guitar,首字母大寫(xiě)變小寫(xiě)。注意如果***個(gè)和第二個(gè)字母都是大寫(xiě),默認(rèn)的Bean的id會(huì)有特殊處理。也可以指定Bean的Id如:

@Component("guitarOne")

public class Guitar implements Intrument{}

23. AOP

面向切面的編程AOP,是一種編程技術(shù),允許程序模塊化橫向切割關(guān)注點(diǎn),或橫切典型的責(zé)任劃分,如日志和事務(wù)管理。

AOP的核心是切面,它將多個(gè)類(lèi)的通用行為封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個(gè)日志模塊可以被稱(chēng)作日志的AOP切面。根據(jù)需求的不同,一個(gè)應(yīng)用程序可以有若干切面。在SpringAOP中,切面通過(guò)帶有@Aspect注解的類(lèi)實(shí)現(xiàn)。

關(guān)注點(diǎn)是應(yīng)用中的一個(gè)模塊的行為,一個(gè)關(guān)注點(diǎn)可能會(huì)被定義成一個(gè)我們想實(shí)現(xiàn)的一個(gè)功能。

橫切關(guān)注點(diǎn)一個(gè)關(guān)注點(diǎn),此關(guān)注點(diǎn)是整個(gè)應(yīng)用都會(huì)使用的功能,并影響整個(gè)應(yīng)用,比如日志,安全和數(shù)據(jù)傳輸,幾乎應(yīng)用的每個(gè)模塊都需要的功能。因此這些都屬于橫切關(guān)注點(diǎn)。

連接點(diǎn)代表一個(gè)應(yīng)用程序的某個(gè)位置,在這個(gè)位置我們可以插入一個(gè)AOP切面,它實(shí)際上是個(gè)應(yīng)用程序執(zhí)行Spring AOP的位置。

切點(diǎn)是一個(gè)或一組連接點(diǎn),通知將在這些位置執(zhí)行??梢酝ㄟ^(guò)表達(dá)式或匹配的方式指明切入點(diǎn)。

引入運(yùn)行我們?cè)谝汛嬖诘念?lèi)中添加新的方法和屬性。

24. AOP通知

通知是個(gè)在方法執(zhí)行前后要做的動(dòng)作,實(shí)際上是程序執(zhí)行時(shí)要通過(guò)SpringAOP框架觸發(fā)的代碼

Spring切面可以應(yīng)用五種類(lèi)型的通知:

before:前置通知,在一個(gè)方法執(zhí)行前被調(diào)用。@Before

after: 在方法執(zhí)行之后調(diào)用的通知,無(wú)論方法執(zhí)行是否成功。@After

after-returning: 僅當(dāng)方法成功完成后執(zhí)行的通知。@AfterReturning

after-throwing: 在方法拋出異常退出時(shí)執(zhí)行的通知。@AfterThrowing

around: 在方法執(zhí)行之前和之后調(diào)用的通知。@Around

25. Spring的事務(wù)類(lèi)型

編程式事務(wù)管理:這意味你通過(guò)編程的方式管理事務(wù),給你帶來(lái)極大的靈活性,但是難維護(hù)。聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和XML配置來(lái)管理事務(wù)。

26. ACID

Atomic原子性:事務(wù)是由一個(gè)或多個(gè)活動(dòng)所組成的一個(gè)工作單元。原子性確保事務(wù)中的所有操作全部發(fā)生或者全部不發(fā)生。

Consistent一致性:一旦事務(wù)完成,系統(tǒng)必須確保它所建模的業(yè)務(wù)處于一致的狀態(tài)

Isolated隔離線(xiàn):事務(wù)允許多個(gè)用戶(hù)對(duì)象頭的數(shù)據(jù)進(jìn)行操作,每個(gè)用戶(hù)的操作不會(huì)與其他用戶(hù)糾纏在一起。

Durable持久性:一旦事務(wù)完成,事務(wù)的結(jié)果應(yīng)該持久化,這樣就能從任何的系統(tǒng)崩潰中恢復(fù)過(guò)來(lái)。

27. JDBC事務(wù)

如果在應(yīng)用程序中直接使用JDBC來(lái)進(jìn)行持久化,譬如博主采用的是Mybatis,DataSourceTransactionManager會(huì)為你處理事務(wù)邊界。譬如:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">

<property name="driverClassName" value="${driver}" />

<property name="url" value="${url}" />

<property name="username" value="zzh" />

<property name="password" value="zzh" />

<property name="validationQuery" value="SELECT 1"/>

</bean>

<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

28. JTA事務(wù)

如果你的事務(wù)需要跨多個(gè)事務(wù)資源(例如:兩個(gè)或多個(gè)數(shù)據(jù)庫(kù);或者如Sping+ActiveMQ整合  需要將ActiveMQ和數(shù)據(jù)庫(kù)的事務(wù)整合起來(lái)),就需要使用JtaTransactionManager:

<bean  id="jtaTransactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"/>

JtaTransactionManager將事務(wù)管理的職責(zé)委托給了一個(gè)JTA的實(shí)現(xiàn)。JTA規(guī)定了應(yīng)用程序與一個(gè)或多個(gè)數(shù)據(jù)源之間協(xié)調(diào)事務(wù)的標(biāo)準(zhǔn)API。transactionManagerName屬性指明了要在JNDI上查找的JTA事務(wù)管理器。JtaTransactionManager將事務(wù)管理的職責(zé)委托給javax.transaction.UserTransaction和javax.transaction.TransactionManager對(duì)象。通過(guò)UserTransaction.commit()方法來(lái)提交事務(wù)。類(lèi)似地,如果事務(wù)失敗,UserTransaction的rollback()方法將會(huì)被調(diào)用。

29. 聲明式事務(wù)

盡管Spring提供了多種聲明式事務(wù)的機(jī)制,但是所有的方式都依賴(lài)這五個(gè)參數(shù)來(lái)控制如何管理事務(wù)策略。因此,如果要在Spring中聲明事務(wù)策略,就要理解這些參數(shù)。(@Transactional)

1. 傳播行為(propagation)

ISOLATION_DEFAULT: 使用底層數(shù)據(jù)庫(kù)預(yù)設(shè)的隔離層級(jí)

ISOLATION_READ_COMMITTED: 允許事務(wù)讀取其他并行的事務(wù)已經(jīng)送出(Commit)的數(shù)據(jù)字段,可以防止Dirty read問(wèn)題

ISOLATION_READ_UNCOMMITTED:  允許事務(wù)讀取其他并行的事務(wù)還沒(méi)送出的數(shù)據(jù),會(huì)發(fā)生Dirty、Nonrepeatable、Phantom read等問(wèn)題

ISOLATION_REPEATABLE_READ: 要求多次讀取的數(shù)據(jù)必須相同,除非事務(wù)本身更新數(shù)據(jù),可防止Dirty、Nonrepeatable  read問(wèn)題

ISOLATION_SERIALIZABLE: 完整的隔離層級(jí),可防止Dirty、Nonrepeatable、Phantom  read等問(wèn)題,會(huì)鎖定對(duì)應(yīng)的數(shù)據(jù)表格,因而有效率問(wèn)題

2. 隔離級(jí)別(isolation)

PROPAGATION_REQUIRED&ndash;支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù)。這是最常見(jiàn)的選擇。

PROPAGATION_SUPPORTS&ndash;支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。

PROPAGATION_MANDATORY&ndash;支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就拋出異常。

PROPAGATION_REQUIRES_NEW&ndash;新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

PROPAGATION_NOT_SUPPORTED&ndash;以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

PROPAGATION_NEVER&ndash;以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

PROPAGATION_NESTED&ndash;如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類(lèi)似的操作。

3. 只讀(read-only)

如果事務(wù)只進(jìn)行讀取的動(dòng)作,則可以利用底層數(shù)據(jù)庫(kù)在只讀操作時(shí)發(fā)生的一些***化動(dòng)作,由于這個(gè)動(dòng)作利用到數(shù)據(jù)庫(kù)在只讀的事務(wù)操作***化,因而必須在事務(wù)中才有效,也就是說(shuō)要搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來(lái)設(shè)置。

4. 事務(wù)超時(shí)(timeout)

有的事務(wù)操作可能延續(xù)很長(zhǎng)一段的時(shí)間,事務(wù)本身可能關(guān)聯(lián)到數(shù)據(jù)表的鎖定,因而長(zhǎng)時(shí)間的事務(wù)操作會(huì)有效率上的問(wèn)題,對(duì)于過(guò)長(zhǎng)的事務(wù)操作,考慮Roll  back事務(wù)并要求重新操作,而不是***時(shí)的等待事務(wù)完成。  可以設(shè)置事務(wù)超時(shí)期間,計(jì)時(shí)是從事務(wù)開(kāi)始時(shí),所以這個(gè)設(shè)置必須搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來(lái)設(shè)置。

5. 回滾規(guī)則(rollback-for,  no-rollback-for):rollback-for指事務(wù)對(duì)于那些檢查型異常應(yīng)當(dāng)回滾而不提交;no-rollback-for指事務(wù)對(duì)于那些異常應(yīng)當(dāng)繼續(xù)運(yùn)行而不回滾。默認(rèn)情況下,Spring聲明事務(wù)對(duì)所有的運(yùn)行時(shí)異常都進(jìn)行回滾。

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="*" />

</tx:attributes>

</tx:advice>

30. SpringMVC

Spring的知識(shí)點(diǎn)有什么

核心架構(gòu)的具體流程:

首先用戶(hù)發(fā)送請(qǐng)求&mdash;&mdash;>DispatcherServlet,前端控制器收到請(qǐng)求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理,作為統(tǒng)一訪(fǎng)問(wèn)點(diǎn),進(jìn)行全局的流程控制;

DispatcherServlet&mdash;&mdash;>HandlerMapping,  HandlerMapping將會(huì)把請(qǐng)求映射為HandlerExecutionChain對(duì)象(包含一個(gè)Handler處理器(頁(yè)面控制器)對(duì)象、多個(gè)HandlerInterceptor攔截器)對(duì)象,通過(guò)這種策略模式,很容易添加新的映射策略;

DispatcherServlet&mdash;&mdash;>HandlerAdapter,HandlerAdapter將會(huì)把處理器包裝為適配器,從而支持多種類(lèi)型的處理器,即適配器  設(shè)計(jì)模式 的應(yīng)用,從而很容易支持很多類(lèi)型的處理器;

HandlerAdapter&mdash;&mdash;>處理器功能處理方法的調(diào)用,HandlerAdapter將會(huì)根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個(gè)ModelAndView對(duì)象(包含模型數(shù)據(jù)、邏輯視圖名);

ModelAndView的邏輯視圖名&mdash;&mdash;> ViewResolver,  ViewResolver將把邏輯視圖名解析為具體的View,通過(guò)這種策略模式,很容易更換其他視圖技術(shù);

View&mdash;&mdash;>渲染,View會(huì)根據(jù)傳進(jìn)來(lái)的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實(shí)際是一個(gè)Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);

返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶(hù),到此一個(gè)流程結(jié)束。

31. DispatcherServlet

SpringMVC的核心是DispatcherServlet,這個(gè)Servlet充當(dāng)SpringMVC的前端控制器。與其他Servlet一樣,DispatcherServlet必須在Web應(yīng)用程序的web.xml文件中進(jìn)行配置。

<servlet>

<servlet-name>viewspace</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

默認(rèn)情況下,DispatcherServlet在加載時(shí)會(huì)從一個(gè)基于這個(gè)Servlet名字的XML文件中加載Spring應(yīng)用上下文。因?yàn)閟ervlet的名字是viewspace,所以配置文件的名稱(chēng)為viewspace-servlet.xml。接下來(lái),必須申明DispatcherServlet處理那些URL:

<servlet-mapping>

<servlet-name>viewspace</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

通過(guò)將DispatcherServlet映射到/,聲明了它會(huì)作為默認(rèn)的servlet并且會(huì)處理所有的請(qǐng)求,包括對(duì)靜態(tài)資源的請(qǐng)求??梢耘渲茫?/p>

<mvc:resources mapping="/images/**" location="/images/"

cache-period="31556926" />

<mvc:resources mapping="/js/**" location="/js/"

cache-period="31556926" />

<mvc:resources mapping="/css/**" location="/css/"

cache-period="31556926" />

處理靜態(tài)資源。

32. 配置HandlerMapping

Spring自帶了多個(gè)處理器映射實(shí)現(xiàn):

BeanNameUrlHandlerMapping:根據(jù)控制器Bean的名字將控制器映射到URL。

ControllerBeanNameHandlerMapping:與BeanNameUrlHandlerMapping類(lèi)似,根據(jù)控制器Bean的名字將控制器映射到URL。使用該處理器映射實(shí)現(xiàn),Bean的名字不需要遵循URL的約定。

ControllerClassNameHandlerMapping:通過(guò)使用控制器的類(lèi)名作為URL基礎(chǔ)將控制器映射到URL。

DefaultAnnotationHandlerMapping:將請(qǐng)求映射給使用@RequestingMapping注解的控制器和控制器方法。

SimpleUrlHandlerMapping:使用定義在Spring應(yīng)用上下文的熟悉集合將控制器映射到URL。

使用如上這些處理器映射通常只需在Spring中配置一個(gè)Bean。如果沒(méi)有找到處理器映射Bean,DisapatchServlet將創(chuàng)建并使用BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。我們一般使用基于注解的控制器類(lèi)。

<mvc:annotation-driven />

<bean id="defaultAnnotationHandlerMapping"

class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

</bean>

在構(gòu)建控制器的時(shí)候,我們還需要使用注解將請(qǐng)求參數(shù)綁定到控制器的方法參數(shù)上進(jìn)行校驗(yàn)以及信息轉(zhuǎn)換。提供注解驅(qū)動(dòng)的特性。

33. 配置HandlerAdapter

<bean id="annotationMethodHandlerAdapter"

class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"  />

34. 配置視圖

在SpringMVC中大齡使用了約定優(yōu)于配置的開(kāi)發(fā)模式。InternalResourceViewResolver就是一個(gè)面向約定的元素。它將邏輯視圖名稱(chēng)解析為View對(duì)象,而該對(duì)象將渲染的任務(wù)委托給Web應(yīng)用程序上下文中的一個(gè)模板。

<!-- 配置視圖解析器,將ModelAndView及字符串解析為具體的頁(yè)面 -->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass"

value="org.springframework.web.servlet.view.JstlView" />

<property name="prefix" value="/WEB-INF/jsp/" />

<property name="suffix" value=".jsp" />

</bean>

當(dāng)DispatcherServlet要求InternalResourceViewResolver解析視圖的時(shí)候,它將獲取一個(gè)邏輯視圖名稱(chēng),添加”/WEB-INF/jsp/”前綴和”.jsp”后綴。等待的結(jié)果就是渲染輸出的JSP路徑。在內(nèi)部,InternalResourceViewResolver接下來(lái)會(huì)將這個(gè)路徑傳遞給View對(duì)象,View對(duì)象將請(qǐng)求傳遞給JSP.

看完上述內(nèi)容,你們掌握Spring的知識(shí)點(diǎn)有什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI