精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring知識點提煉

開發(fā) 后端
Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性的角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。

 1. Spring框架的作用

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

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

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

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

MVC框架: Spring-MVC

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

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

2. Spring的組成

 

 

Spring由7個模塊組成:

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

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

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

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

Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關(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 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>

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

3. Spring容器

Sping的容器可以分為兩種類型

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

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

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

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

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

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

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

5. IOC & DI

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

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

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

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

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

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

XML配置文件

基于注解的配置

基于Java的配置@Configuration, @Bean

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

id

name

class

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

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

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

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

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

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

default-init-method

default-destory-method

default-autowire:默認(rèn)為none,應(yīng)用于Spring配置文件中的所有Bean,注意這里不是指Spring應(yīng)用上下文,因為你可以定義多個配置文件

9. Bean的生命周期

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

2) 屬性注入(autowireByName, autowireByType)

3) 初始化Bean

3.1 激活A(yù)ware方法:(invokeAwaresMethods)Spring中提供了一些Aware相關(guān)接口,比如BeanNameAware, BeanFactoryAware, ApplicationContextAware等,實現(xiàn)這些Aware接口的bean在被初始化之后,可以取得一些相對應(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)用客戶自定義初始化方法前以及調(diào)用自定義初始化方法后分別會調(diào)用BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法,使用戶可以根據(jù)自己的業(yè)務(wù)需求進(jìn)行響應(yīng)的處理。3.3 激活自定義的init方法(init-method & 自定義實現(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{

//對特殊的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)用上下文被銷毀。5) 銷毀(destory-mthod & 實現(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類的postProcessAfterInitialization()方法

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

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

10. Spring中注入集合

<list>允許值相同

<set>不允許值相同

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

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

11. 裝配空值

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

12. 自動裝配(autowiring)

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

13. 注解

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

Spring自帶的@Autowired注解

JSR-330的@Inject注解

JSR-250的@Resource注解

14. @Autowired

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

@Autowired(required=false)

private Object obj;

注意required屬性可以用于@Autowired注解所使用的任意地方。但是當(dāng)使用構(gòu)造器裝配時,只有一個構(gòu)造器可以將@Autowired的required屬性設(shè)置為true。其他使用@Autowired注解所標(biāo)注的構(gòu)造器只能將required屬性設(shè)置為false。此外,當(dāng)使用@Autowired標(biāo)注多個構(gòu)造器時,Spring就會從所有滿足裝配條件的構(gòu)造器中選擇入?yún)⒆疃嗟哪莻€構(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{}

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

@Autowired

@SpecialQualifier

private Object obj;

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

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

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

17. @Inject

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

18. @Named

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

@Inject

@Named("objName")

private Object obj;

19. SpEL表達(dá)式

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

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

20. @Value

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

@Value("Eruption")

private String song;

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

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

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

21. 自動檢測Bean

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

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

22. 為自動檢測標(biāo)注Bean

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

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

- @Controller:標(biāo)識將該類定義為SpringMVC controller

- @Repository:標(biāo)識將該類定義為數(shù)據(jù)倉庫

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

以@Component為例:

@Component

public class Guitar implements Intrument{}

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

@Component("guitarOne")

public class Guitar implements Intrument{}

23. AOP

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

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

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

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

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

切點是一個或一組連接點,通知將在這些位置執(zhí)行。可以通過表達(dá)式或匹配的方式指明切入點。

引入運行我們在已存在的類中添加新的方法和屬性。

24. AOP通知

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

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

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

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

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

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

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

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

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

26. ACID

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

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

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

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

27. JDBC事務(wù)

如果在應(yīng)用程序中直接使用JDBC來進(jìn)行持久化,譬如博主采用的是Mybatis,DataSourceTransactionManager會為你處理事務(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ù)需要跨多個事務(wù)資源(例如:兩個或多個數(shù)據(jù)庫;或者如Sping+ActiveMQ整合 需要將ActiveMQ和數(shù)據(jù)庫的事務(wù)整合起來),就需要使用JtaTransactionManager:

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

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

29. 聲明式事務(wù)

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

1. 傳播行為(propagation)

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

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

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

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

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

2. 隔離級別(isolation)

PROPAGATION_REQUIRED–支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。這是最常見的選擇。

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

PROPAGATION_MANDATORY–支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

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

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

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

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

3. 只讀(read-only)

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

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

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

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

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

<tx:attributes>

<tx:method name="*" />

</tx:attributes>

</tx:advice>

30. SpringMVC

 

 

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

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

DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

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

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

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

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

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

31. DispatcherServlet

SpringMVC的核心是DispatcherServlet,這個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在加載時會從一個基于這個Servlet名字的XML文件中加載Spring應(yīng)用上下文。因為servlet的名字是viewspace,所以配置文件的名稱為viewspace-servlet.xml。接下來,必須申明DispatcherServlet處理那些URL:

<servlet-mapping>

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

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

</servlet-mapping>

通過將DispatcherServlet映射到/,聲明了它會作為默認(rèn)的servlet并且會處理所有的請求,包括對靜態(tài)資源的請求。可以配置:

<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自帶了多個處理器映射實現(xiàn):

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

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

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

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

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

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

<mvc:annotation-driven />

<bean id="defaultAnnotationHandlerMapping"

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

</bean>

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

33. 配置HandlerAdapter

<bean id="annotationMethodHandlerAdapter"

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

34. 配置視圖

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

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

<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解析視圖的時候,它將獲取一個邏輯視圖名稱,添加”/WEB-INF/jsp/”前綴和”.jsp”后綴。等待的結(jié)果就是渲染輸出的JSP路徑。在內(nèi)部,InternalResourceViewResolver接下來會將這個路徑傳遞給View對象,View對象將請求傳遞給JSP.

責(zé)任編輯:趙立京 來源: ImportNew
相關(guān)推薦

2021-04-13 08:25:12

測試開發(fā)Java注解Spring

2010-08-17 14:56:00

HCNE認(rèn)證

2011-04-15 12:25:21

BGP路由

2025-01-07 14:10:46

SpringBoot開發(fā)Java

2023-02-15 08:12:19

http超時過濾器

2025-05-07 08:55:00

2010-08-18 10:52:46

Linux筆試

2025-07-09 09:05:00

2020-10-07 15:15:41

Python

2025-05-19 10:00:00

MySQL數(shù)據(jù)庫InnoDB

2010-09-02 10:11:11

華為認(rèn)證

2021-08-13 08:36:15

SpringMVC自定義

2010-06-17 16:42:04

UML

2010-07-27 15:49:28

Flex

2009-12-18 17:34:38

Ruby線程

2021-01-18 10:33:53

Java反射模塊

2009-08-06 17:42:32

C#知識點

2010-12-29 10:14:09

2017-11-01 15:38:54

jvm知識點總覽

2020-07-01 17:25:28

Redis數(shù)據(jù)庫內(nèi)存
點贊
收藏

51CTO技術(shù)棧公眾號

欧美特黄aaaaaa| 五月婷婷狠狠操| 免费观看的毛片| 夜夜嗨一区二区三区| 亚洲欧美激情在线视频| av在线网址导航| 日本欧美电影在线观看| 99精品热视频| 国产免费久久av| 久草免费在线观看视频| 网红女主播少妇精品视频| 欧美日韩精品欧美日韩精品一 | 三年中文在线观看免费大全中国| 毛片大全在线观看| 欧美激情一区二区三区蜜桃视频| 91久久久久久久| 日韩精品乱码久久久久久| 奇米影视亚洲| 日韩精品免费在线| 韩国三级与黑人| 久久亚洲精品爱爱| 午夜免费久久看| 中文字幕色一区二区| 偷拍自拍在线| 国产91色综合久久免费分享| 国产精品高清网站| 欧美一级视频免费观看| 亚洲国产精品久久久天堂| 亚洲欧洲国产伦综合| 国产一精品一aⅴ一免费| 国语自产精品视频在线看抢先版结局 | 色噜噜久久综合伊人一本| 91精品国产高清91久久久久久 | 99精品福利视频| 欧美成人免费一级人片100| xxxxx在线观看| 美女视频亚洲色图| 日韩精品综合一本久道在线视频| 奇米影音第四色| 欧美成人ⅴideosxxxxx| 午夜国产不卡在线观看视频| 蜜臀av.com| 日本在线观看www| 国产欧美一二三区| 蜜桃精品久久久久久久免费影院| 性一交一乱一精一晶| 激情国产一区二区| 国产一区深夜福利| 一级aaaa毛片| 激情成人午夜视频| 成人疯狂猛交xxx| 中文字幕免费观看视频| 日韩精品一级中文字幕精品视频免费观看 | 欧美视频免费在线观看| 国产96在线 | 亚洲| 欧美videos另类精品| 中文字幕五月欧美| 亚洲毛片aa| 一级日本在线| 亚洲天堂久久久久久久| japanese在线视频| 在线看三级电影| 亚洲午夜在线电影| 国产乱淫av片杨贵妃| 成人性生交大片免费看网站| 亚洲高清不卡在线观看| 丰满少妇久久久| 神马久久午夜| 在线观看免费成人| 国内国产精品天干天干| 国产日本亚洲| 精品国产污网站| 国产三级国产精品| 精品国产一区一区二区三亚瑟| 国产亚洲精品久久久久久牛牛| 成熟人妻av无码专区| 欧美色女视频| 久久久精品在线| 久久久久人妻一区精品色欧美| 激情综合电影网| 日本成人免费在线| 国产精品久久久久久久免费看| 国产一区二区三区黄视频 | 午夜av免费在线观看| 国产亚洲va综合人人澡精品 | 国产香蕉在线| 日韩一区在线看| www插插插无码免费视频网站| 日本在线影院| 欧美日韩高清影院| 岛国精品一区二区三区| 欧美精品尤物在线观看| 欧美肥臀大乳一区二区免费视频| 国产精品男女视频| 久久爱另类一区二区小说| 国产精品一 二 三| аⅴ资源新版在线天堂| 一区二区三区精品在线| 无码人妻丰满熟妇区毛片18| 婷婷精品久久久久久久久久不卡| 亚洲成人精品在线| 国产精品1区2区3区4区| 伊人影院久久| 91日韩在线视频| 欧美xxx.com| 一区二区三区国产精品| 国产xxxxx视频| 亚洲不卡在线| 一区二区三区四区精品| 国产亚洲精品av| 男女性色大片免费观看一区二区| 国产精品日韩一区二区三区| 在线日本视频| 色综合天天视频在线观看| 四川一级毛毛片| 欧美日韩激情| 欧美在线日韩在线| 亚洲美女福利视频| 自拍偷自拍亚洲精品播放| 日韩手机在线观看视频| 99久久人爽人人添人人澡| 深夜福利一区二区| 一级久久久久久| 26uuu色噜噜精品一区二区| 精品嫩模一区二区三区| jizz亚洲女人高潮大叫| 亚洲美女av在线播放| 免费观看一级视频| 国产精品123区| 色中文字幕在线观看| 亚洲成人av观看| 亚洲精品v欧美精品v日韩精品| 极品久久久久久| 美女在线视频一区| 日本一区免费看| 在线成人av观看| 日韩激情视频在线| 国产一级18片视频| 91啪亚洲精品| 红桃av在线播放| 一区二区三区韩国免费中文网站| 97精品伊人久久久大香线蕉| 亚洲国产成人一区二区| 一区二区成人在线视频| 国产精品探花在线播放| 国产精品x453.com| 国产一区二区香蕉| caopon在线免费视频| 91精品国产入口| 午夜国产福利一区二区| 国产一级精品在线| 91免费版看片| jizz18欧美18| 性欧美视频videos6一9| 天天影院图片亚洲| 色94色欧美sute亚洲13| 日本成人午夜影院| 老司机精品视频在线| 亚洲午夜精品国产| 国产午夜精品一区在线观看| 欧美另类极品videosbest最新版本 | 黄色免费成人| 国产精品午夜av在线| 日韩欧美精品一区二区三区| 亚洲精品小视频在线观看| 五月天激情四射| 欧美经典一区二区三区| 久久国产激情视频| 欧美xxx在线观看| 国产精品伊人日日| 三上悠亚亚洲一区| 日韩在线视频观看正片免费网站| 国产精品色综合| 亚洲高清视频中文字幕| 国产传媒第一页| 六月丁香婷婷久久| 波多野结衣与黑人| 色天下一区二区三区| 国产精品九九九| gogogogo高清视频在线| 亚洲精品国产品国语在线| 国产99免费视频| 亚洲免费在线播放| 噜噜噜在线视频| 卡一卡二国产精品| 日本香蕉视频在线观看| 中文字幕亚洲影视| 91中文字幕在线| 精品极品在线| 精品精品国产国产自在线| 视频一区 中文字幕| 欧美熟乱第一页| 国产精品.www| 国产精品嫩草久久久久| 男男一级淫片免费播放| 免播放器亚洲一区| 欧美不卡在线播放| 我不卡影院28| 欧美日韩系列| 亚洲国产欧美国产第一区| 茄子视频成人在线| 最新黄网在线观看| 亚洲最大中文字幕| 欧美特级特黄aaaaaa在线看| 欧美日韩一卡二卡三卡| 日本三级欧美三级| 亚洲日本电影在线| 最近中文字幕在线mv视频在线 | а√天堂在线官网| 亚洲色图av在线| 蜜臀久久久久久999| 这里只有精品电影| 精人妻无码一区二区三区| 亚洲午夜影视影院在线观看| 刘亦菲国产毛片bd| 久久在线观看免费| 稀缺呦国内精品呦| 国产精品资源在线观看| 激情五月开心婷婷| 亚洲精品在线二区| www.日本在线视频| 亚洲激情中文在线| 一本一道久久a久久精品综合| 亚洲资源网你懂的| 精品久久久久久综合日本| 亚洲一区二区三区在线免费| 成人av番号网| 免费在线成人激情电影| 国产精品 欧美在线| 神马久久午夜| 91av免费观看91av精品在线| 欧美6一10sex性hd| 欧美成人合集magnet| 免费在线毛片网站| 日韩视频中文字幕| av在线女优影院| 一区二区福利视频| 黄色美女网站在线观看| 亚洲色无码播放| 久久久久久青草| 亚洲男人天堂古典| 可以免费看污视频的网站在线| 亚洲精品国精品久久99热| 国 产 黄 色 大 片| 精品久久久久久久久久久久久久久 | 国产亚洲色婷婷久久99精品91| 国产精品一区三区| 国产精品19p| 国产成人日日夜夜| 日韩黄色一区二区| 波多野结衣在线一区| 四虎一区二区| aaa级黄色片| 欧美日本高清视频在线观看| 一级黄色在线视频| 色狠狠桃花综合| 国产女主播喷水视频在线观看| 日韩欧美福利视频| 日本一区二区免费电影| 日本丰满少妇一区二区三区| 日韩国产成人在线| 欧美日韩一二三区| 国产又粗又黄视频| 91精品婷婷国产综合久久性色| 国产三级午夜理伦三级| 日韩欧美高清在线| 天天干天天爽天天操| 日韩精品日韩在线观看| 黄色av网址在线免费观看| 亚洲性69xxxbbb| 日本中文字幕电影在线免费观看| 中文字幕国内精品| 菠萝菠萝蜜在线观看| 久久久久久久久久久网站| 日本午夜大片a在线观看| 国产精品福利小视频| 97色婷婷成人综合在线观看| 99在线视频首页| 亚洲素人在线| 一区二区三区四区在线视频 | 麻豆国产91在线播放| 男男受被啪到高潮自述| 99精品久久99久久久久| 日韩影视一区二区三区| 一区二区三区久久久| 亚洲欧美精品一区二区三区| 欧美日韩国产天堂| 黄色av免费观看| 亚洲人成电影网站色…| 成人看av片| 欧美一级黑人aaaaaaa做受| 六九午夜精品视频| 国严精品久久久久久亚洲影视| 国产探花一区| 精品嫩模一区二区三区| 久久久久久久尹人综合网亚洲| www.51色.com| 91麻豆国产香蕉久久精品| 极品久久久久久| 91黄色免费看| 高清毛片aaaaaaaaa片| 中文字幕免费精品一区高清| www.九色在线| 91九色单男在线观看| 亚洲欧美日本伦理| 国产激情片在线观看| 日本在线播放一区二区三区| av免费观看不卡| 1000精品久久久久久久久| 国产精品男女视频| 精品日本一线二线三线不卡| av网站在线免费播放| 国产91对白在线播放| 蜜桃精品视频| 亚洲日本一区二区三区在线不卡| 国产日韩视频| 蜜桃视频无码区在线观看| 国产精品网站导航| 久久中文字幕免费| 亚洲成人网在线| 在线免费观看污| 国产中文字幕91| 欧美综合另类| 六月丁香婷婷在线| aaa欧美日韩| 国产一级在线视频| 日韩欧美亚洲一区二区| 日本在线观看| 国产精品自产拍在线观| 欧美精品一区二区三区中文字幕 | 日韩欧美三级在线| 国产调教视频在线观看| 成人高清视频观看www| 成人羞羞网站入口| 国产又猛又黄的视频| 国产午夜精品久久久久久久 | 日韩一区二区三区视频在线| 日本美女在线中文版| 欧洲成人午夜免费大片| 欧美日日夜夜| 亚洲美免无码中文字幕在线 | 久久久视频6r| 色婷婷激情久久| 你懂的好爽在线观看| 日韩美女免费观看| 国产不卡一区| 69久久久久久| 日韩理论片中文av| 国产又粗又猛视频| 日韩在线视频免费观看| 国产精品一区二区美女视频免费看 | 伊人春色之综合网| 日韩欧美亚洲天堂| 91色porny在线视频| 国产又粗又爽视频| 在线观看不卡av| 日韩在线激情| 成人在线免费观看网址| 国产成+人+日韩+欧美+亚洲| 久久久久香蕉视频| 亚洲国产小视频| 成人免费看黄| 一本一道久久a久久精品综合| 精品夜夜嗨av一区二区三区| 国产高潮流白浆| 精品国产免费久久| 在线男人天堂| 亚洲精品国产一区| 国产精品自在在线| 亚洲欧美在线视频免费| 亚洲色图国产精品| 亚洲成人高清| 青青在线免费观看| 久久精品人人做人人爽人人 | 欧美xxxxx牲另类人与| 91黄页在线观看| 欧美日韩综合精品| 黄网站免费久久| 日韩手机在线观看| 亚洲色图狂野欧美| 久久九九精品视频| 日韩欧美一区三区| 国产精品久久久久影院亚瑟| 草草视频在线播放| 欧洲美女免费图片一区| 99精品电影| 免费黄色三级网站| 欧美日韩黄色影视| wwww亚洲| 亚洲亚洲精品三区日韩精品在线视频| 国产精品综合在线视频| 亚洲日本视频在线观看| 插插插亚洲综合网| 亚洲宅男网av| 成人啪啪18免费游戏链接| 欧美无人高清视频在线观看| 色a资源在线| 亚洲人久久久| 91免费国产在线观看| av中文字幕在线免费观看|