基于spring-mvc.xml和application-context.xml的配置與深入理解
前沿
1、application-context.xml是全局的
應(yīng)用于多個(gè)serverlet,配合listener一起使用,web.xml中配置如下:
<!-- 配置監(jiān)聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
2、spring-mvc.xml 是spring mvc的配置
web.xml中配置如下:
<!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
application-context.xml這個(gè)一般是采用非spring mvc架構(gòu),用來加載Application Context。
如果直接采用SpringMVC,只需要把所有相關(guān)配置放到spring-mvc.xml中就好,一般spring mvc項(xiàng)目用不到多個(gè)serverlet。
開始進(jìn)入正題。
(1)application-context.xml配置
spring的核心配置文件的名字 叫做 applicationContext.xml,后期也可以通過配置文件中的配置修改名稱,在web.xml中進(jìn)行如下配置:

1、首先介紹一下啟動(dòng)一個(gè)項(xiàng)目的整體流程:
- 1、tomcat啟動(dòng)一個(gè)WEB項(xiàng)目的時(shí)候,WEB容器會(huì)去讀取它的配置文件web.xml,讀取<listener>和<context-param>兩個(gè)結(jié)點(diǎn)。
- 2、緊接著,容器創(chuàng)建一個(gè)ServletContext(servlet上下文,全局的),這個(gè)web項(xiàng)目的所有部分都將共享這個(gè)上下文。可以把ServletContext看成是一個(gè)Web應(yīng)用的服務(wù)器端組件的共享內(nèi)存,在ServletContext中可以存放共享數(shù)據(jù)。ServletContext對(duì)象是真正的一個(gè)全局對(duì)象,凡是web容器中的Servlet都可以訪問
- 3、容器將<context-param>轉(zhuǎn)換為鍵值對(duì),并交給servletContext。
- 4、容器創(chuàng)建<listener>中的類實(shí)例,創(chuàng)建監(jiān)聽器。 listener中ContextLoaderListener監(jiān)聽器的作用就是啟動(dòng)Web容器時(shí),監(jiān)聽servletContext對(duì)象的變化,獲取servletContext對(duì)象的<context-param>,來自動(dòng)裝配ApplicationContext的配置信息。(即加載applicationContext.xml文件)
2、現(xiàn)在開始正式講解applicationContext.xml中的配置內(nèi)容
1、掃描service層和dao層注解(spring中掃描service,然后再在SpringMVC中掃描controller中掃描controller。 因?yàn)槿绻鸆ontroller在主容器中進(jìn)行掃描的話會(huì)掃描到原樣的service,那時(shí)service還沒有進(jìn)行事務(wù)處理可能會(huì)引起事務(wù)失效)

如圖所示:首先是開啟注解掃描,其次是設(shè)置注解掃描的包:com.dao和com.service
A、 <context:annotation-config/> : 自動(dòng)簡(jiǎn)化的完成相應(yīng)bean的聲明。
啟動(dòng)spring的一些注解,主要包括:向 Spring 容器注冊(cè)如下4 個(gè)BeanPostProcessor。
- 1、AutowiredAnnotationBeanPostProcessor @Autowired注解
- 2、CommonAnnotationBeanPostProcessor @ Resource 、@ PostConstruct、@ PreDestroy
- 3、PersistenceAnnotationBeanPostProcessor @PersistenceContext注解
- 4、RequiredAnnotationBeanPostProcessor 這 @Required的注解
注冊(cè)這4個(gè) BeanPostProcessor的作用,就是為了你的系統(tǒng)能夠識(shí)別相應(yīng)的注解。
<context:annotation-config/>的方式等價(jià)于以下的傳統(tǒng)方式:
<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
但是配置更加簡(jiǎn)單,方便,不需要按照傳統(tǒng)的方式一條一條配置顯得有些繁瑣和沒有必要,于是spring給我們提供<context:annotation-config/>的簡(jiǎn)化配置方式,自動(dòng)幫你完成聲明。
B、 設(shè)置使用注解的類所在的包 主要是dao層和service層,剔除controller層注解掃描

注意,這部分主要是掃描項(xiàng)目中除了controller以外的其他層的注解。配置這部分的目的是在于掃描service包和dao包里面的類,只要有@Service或者@Repository就注冊(cè)成spring容器中的Bean,下次可以通過@Autowired直接注入。
如果有B的配置,可以不需要A的配置,<context:component-scan base-package=”XX.XX”/> , 該配置項(xiàng)其實(shí)也包含了自動(dòng)注入上述processor的功能,因此當(dāng)使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。
2、配置數(shù)據(jù)庫(kù)相關(guān)內(nèi)容(這部分內(nèi)容可以單獨(dú)用一個(gè)spring-mybatis.xml進(jìn)行配置,本項(xiàng)目沒有單獨(dú)進(jìn)行配置,而是和applicaitonContext.xml文件一起配置的)
配置db.properties文件-----》配置數(shù)據(jù)源(dataSource(可以采用數(shù)據(jù)庫(kù)連接池),可以配置多個(gè)數(shù)據(jù)源(如果有多個(gè)數(shù)據(jù)庫(kù)的話))---》配置spring+mybatis(Spring和Mybatis整合有兩種方式)----》配置事務(wù)(事務(wù)管理器、配置事務(wù)傳播特性、事務(wù)aop配置)
首先準(zhǔn)備db.properties 配置文件
1、所在項(xiàng)目文件夾的位置:

2、applicationContext.xml文件定位到dbconfig.properties文件

3、dbconfig.properties文件內(nèi)容

4、在applicationContext.xml中配置數(shù)據(jù)源,后期需要可以在其中添加多個(gè)屬性配置。

5、配置spring+mybatis(主要是獲取sqlSession對(duì)象,通過MapperScannerConfigurer 自動(dòng)裝配SqlSessionFactory 或 SqlSessionTemplate,MapperFactoryBean 創(chuàng)建的代理類實(shí)現(xiàn)了 UserMapper 接口,并且注入到應(yīng)用程序中)
創(chuàng)建SqlSessionFactory的過程:
①定義Configuration對(duì)象(包括數(shù)據(jù)源,事務(wù),mapper文件資源以及影響數(shù)據(jù)庫(kù)行為屬性設(shè)置的settings) --> ②由Configuration對(duì)象創(chuàng)建一個(gè)SqlSessionFactoryBuilder對(duì)象 --> ③由SessionFactoryBuilder獲得SqlSessionFactory實(shí)例 --> ④由SqlSessionFactory實(shí)例獲得SqlSession實(shí)例,操作數(shù)據(jù)庫(kù)
在 MyBatis 中,使用 SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory ,進(jìn)而來創(chuàng)建 SqlSession。一旦你獲得一個(gè) session 之后,你可以使用它來執(zhí)行映射語(yǔ)句,提交或回滾連接,最后,當(dāng)不再需要它的時(shí)候, 你可以關(guān)閉 session。
Mybatis社區(qū)自己開發(fā)了一個(gè)Mybatis-Spring用來滿足Mybatis用戶整合Spring的需求。使用 MyBatis-Spring 之后, 會(huì)使用SqlSessionFactoryBean來代替SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory,然后可以使用下面兩種方式使用sqlSession。
1、SqlSessionTemplate;
2、SqlSessionDaoSupport;上面做法沒問題,但就是在spring.xml中需要配置所有的dao層實(shí)現(xiàn),把sqlSession或者sqlSessionFactory注入進(jìn)去,可以使用MapperScannerConfigurer來解決這個(gè)問題,MapperScannerConfigurer幫我們自動(dòng)裝配SqlSessionFactory 或 SqlSessionTemplate,因此不需要我們?cè)赼pplicationContext.xml文件中注入sqlSession或者sqlSessionFactory。
SqlSessionFactoryBean、SqlSessionFactory、SqlSession、SqlSessionTemplate之間的關(guān)系。

SqlSessionFactoryBean是生產(chǎn)SqlSessionFactory的一種工廠Bean;SqlSessionFactory是一種生產(chǎn)SqlSession的工廠;SqlSession是代表數(shù)據(jù)庫(kù)連接客戶端和數(shù)據(jù)庫(kù)Server之間的會(huì)話信息;SqlSessionTemplate是SqlSession的一個(gè)具體實(shí)現(xiàn)。
SqlSessionTemplate介紹:
Mybatis-Spring提供了一種直接使用SqlSession的方式(一個(gè)實(shí)現(xiàn)了SqlSession接口的SqlSessionTemplate實(shí)現(xiàn)類)
- 1、它是線程安全的,可以被多個(gè)Dao同時(shí)使用;
- 2、 它跟Spring的事務(wù)進(jìn)行了關(guān)聯(lián),確保當(dāng)前被使用的SqlSession是一個(gè)已經(jīng)和Spring的事務(wù)進(jìn)行綁定了的,而且它還可以自己管理Session的提交和關(guān)閉。
applicationContext.xml配置:Spring和Mybatis整合有兩種方式

方式一:需要mapper.xml文件,mapper文件里面寫sql語(yǔ)句,UserMapper接口類里面不寫sql語(yǔ)句
方式二:不需要mapper.xml文件,但是需要在UserMapper里面寫sql語(yǔ)句
5.1、需要配置MapperScannerConfigurer 自動(dòng)掃描 將Mapper接口生成代理注入到Spring,這部分實(shí)現(xiàn)mapper.xml文件映射成mapper接口類的實(shí)現(xiàn)類,自動(dòng)注入到spring中,這樣我們就不用寫mapper接口的實(shí)現(xiàn)類了。

原理:Mybatis在與Spring集成的時(shí)候可以配置MapperFactoryBean來生成Mapper接口的代理,MapperFactoryBean 創(chuàng)建的代理類實(shí)現(xiàn)了 UserMapper 接口,并且注入到應(yīng)用程序中。 因?yàn)榇韯?chuàng)建在運(yùn)行時(shí)環(huán)境中(Runtime,譯者注) ,那么指定的映射器必須是一個(gè)接口,而 不是一個(gè)具體的實(shí)現(xiàn)類。MapperScannerConfigurer , 它 將 會(huì) 查 找 類 路 徑 下 的 映 射 器 并 自 動(dòng) 將 它 們 創(chuàng) 建 成 MapperFactoryBean。(需要增加對(duì)MapperFactoryBean源碼的理解)
注 意 , 沒 有 必 要 去 指 定 SqlSessionFactory 或 SqlSessionTemplate , 因 為 MapperScannerConfigurer 將會(huì)創(chuàng)建 MapperFactoryBean,之后自動(dòng)裝配。但是,如果你使 用了一個(gè) 以上的 DataSource ,那 么自動(dòng) 裝配可 能會(huì)失效 。這種 情況下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 屬性來設(shè)置正確的 bean 名 稱來使用。這就是它如何來配置的,注意 bean 的名稱是必須的,而不是 bean 的引用,因 此,value 屬性在這里替代通常的 ref。
6、配置事務(wù)管理器(聲明式事務(wù):用面向切片編程AOP的思想,來管理事務(wù);編程式:TransactionTemplate)
<!-- 對(duì)dataSource 數(shù)據(jù)源進(jìn)行事務(wù)管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事務(wù)管理 通知,對(duì)不同的方法進(jìn)行不同的事務(wù)管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 對(duì)insert,create,update,modify,delete,remove 開頭的方法進(jìn)行事務(wù)管理,只要有異常就回滾 -->
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<!-- find,get,select,count開頭的方法,開啟只讀,提高數(shù)據(jù)庫(kù)訪問性能 -->
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="count*" read-only="true" />
<!-- 對(duì)其他方法 使用默認(rèn)的事務(wù)管理 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 事務(wù) aop 配置
<aop:pointcut>切入點(diǎn) <aop:advice>需要注入的方法 <aop:advisor> 適配器,把注入的方法注入切入點(diǎn)的位置,是連接pointcut跟advice的工具-->
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(public * com.service..*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
<!-- 配置使Spring采用CGLIB代理 --><!-- 開啟基于@AspectJ切面的注解處理器 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- 配置 Annotation 驅(qū)動(dòng),掃描@Transactional注解的類定義事務(wù) -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
事務(wù)管理的兩種方式:
事務(wù)管理對(duì)于企業(yè)應(yīng)用而言,是至關(guān)重要的,即使出現(xiàn)異常情況,他也可以保證數(shù)據(jù)的一致性。
事務(wù)的管理方式有兩種:
- 1、支持編程式事務(wù)管理、
- 2、支持聲明式事務(wù)管理方式。編程式事務(wù)管理是使用:TransactionTemplate,聲明式事務(wù)管理建立在AOP之上,其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后,根據(jù)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)的優(yōu)點(diǎn)是可以基于注解@Transactional來管理,很方便,但是不足之處在于粒度較大,只能作用到方法級(jí)別,不能像編程式事務(wù)那樣,做到代碼塊級(jí)別。
(2)sping-mvc.xml的配置
web項(xiàng)目啟動(dòng)時(shí),讀取web.xml配置文件,首先解析的是applicationContext.xml文件,其次才是sping-mvc.xml文件,sping-mvc.xml文件中主要的工作是:?jiǎn)?dòng)注解、掃描controller包注解;靜態(tài)資源映射;視圖解析(defaultViewResolver);文件上傳(multipartResolver);返回消息json配置。
1.自動(dòng)掃描
<!-- 自動(dòng)掃描該包,使SpringMVC認(rèn)為包下用了@controller注解的類是控制器 --> <context:component-scan base-package="com.javen.controller" />
2.注解驅(qū)動(dòng)
<!-- 擴(kuò)充了注解驅(qū)動(dòng),可以將請(qǐng)求參數(shù)綁定到控制參數(shù)--> <mvc:annotation-driven />
3.靜態(tài)資源處理
<!-- 靜態(tài)資源處理 css js images --> <mvc:resources location="/resources/**" mapping="/resource/"/>
4.避免IE執(zhí)行AJAX時(shí),返回JSON出現(xiàn)下載文件
<!-- 避免IE執(zhí)行AJAX時(shí),返回JSON出現(xiàn)下載文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean>
5.啟動(dòng)SpringMVC的注解功能,完成請(qǐng)求和注解POJO的映射
<!-- 啟動(dòng)SpringMVC的注解功能,完成請(qǐng)求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"/><!-- JSON轉(zhuǎn)換器 --> </list> </property> </bean>
6.配置文件上傳
<!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當(dāng)然如果不配,那么配置文件中也不必引入上傳組件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默認(rèn)編碼 --> <property name="defaultEncoding" value="utf-8" /> <!-- 上傳文件最大值 --> <property name="maxUploadSize" value="10485760000"/> <!-- 內(nèi)存中的最大值 --> <property name="maxInMemorySize" value="40960"/> <!-- 啟用是為了推遲文件解析,以便捕獲文件大小異常 --> <property name="resolveLazily" value="true"/> </bean>
7.配置viewResolver視圖解析
<!-- 配置viewResolver。可以用多個(gè)viewResolver。使用order屬性排序。InternalResourceViewResolver 放在最后 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order" value="1"></property> <property name="mediaTypes"> <map> <!-- 告訴視圖解析器,返回的類型為json格式 --> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> <entry key="htm" value="text/htm" /> </map> </property> <property name="defaultViews"> <list> <!-- ModelAndView里的數(shù)據(jù)變成JSON --> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> </list> </property> <property name="ignoreAcceptHeader" value="true"></property> </bean>
8.定義跳轉(zhuǎn)的文件的前后綴 ,視圖模式配置
<!-- 定義跳轉(zhuǎn)的文件的前后綴 ,視圖模式配置--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 這里的配置我的理解是自動(dòng)給后面action的方法return的字符串加上前綴和后綴,變成一個(gè) 可用的url地址 --> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Swing組件單選框JRadioButton用法示例
這篇文章主要介紹了Java Swing組件單選框JRadioButton用法,結(jié)合具體實(shí)例形式分析了Swing單選框JRadioButton的使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-11-11
MybatisPlus整合Flowable出現(xiàn)的坑及解決
這篇文章主要介紹了MybatisPlus整合Flowable出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringBoot 啟動(dòng)報(bào)錯(cuò)Unable to connect to 
這篇文章主要介紹了SpringBoot 啟動(dòng)報(bào)錯(cuò)Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379問題的解決方案,文中通過圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決問題有一定的幫助,需要的朋友可以參考下2024-10-10
全面解析SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理
這篇文章主要介紹了全面解析SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)
這篇文章主要介紹了如何使用SpringBoot整合Quartz,并將定時(shí)任務(wù)寫入庫(kù)中(持久化存儲(chǔ)),還可以任意對(duì)定時(shí)任務(wù)進(jìn)行如刪除、暫停、恢復(fù)等操作,需要的可以了解下2023-09-09
使用Java獲取Json中的數(shù)據(jù)簡(jiǎn)單示例
開發(fā)過程中經(jīng)常會(huì)遇到j(luò)son數(shù)據(jù)的處理,而單獨(dú)對(duì)json數(shù)據(jù)進(jìn)行增刪改并不方便,下面這篇文章主要給大家介紹了關(guān)于使用Java獲取Json中的數(shù)據(jù),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗(yàn)
IntelliJ?IDEA?2022.2為遠(yuǎn)程開發(fā)功能帶來了多項(xiàng)質(zhì)量改進(jìn),使其更美觀、更穩(wěn)定,新版本還具有多項(xiàng)值得注意的升級(jí)和改進(jìn),下面跟隨小編一起看看IDEA?2022.2新版本吧2022-08-08
IntelliJ IDEA運(yùn)行bat腳本,自動(dòng)taskkill端口進(jìn)程
這篇文章主要介紹了IDEA里面無法運(yùn)行bat文件的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

