Spring MVC配置文件的三個常用配置詳解


Spring MVC項目中通常會有二個配置文件,sprng-servlet.xml和applicationContext.xml二個配置文件,

前者主要是用來實現mvc的,后者主要是用來實現ioc的,后者的配置文件中通常有一下幾個節點:

 

1. <context:annotation-config />

  它的作用是隱式地向 Spring 容器注冊  AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor 這4個BeanPostProcessor。其作用是如果你想在程序中使用注解,就必須先注冊該注解對應的類,如下圖所示:

依賴的類 注解
CommonAnnotationBeanPostProcessor @Resource 、@PostConstruct、@PreDestroy
PersistenceAnnotationBeanPostProcessor的Bean @PersistenceContext
AutowiredAnnotationBeanPostProcessor Bean @Autowired  @Value
RequiredAnnotationBeanPostProcessor @Required
ConfigurationClassPostProcessor
@Configuration
EventListenerMethodProcessor
@EventListener
   

  當然也可以自己進行注冊:

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/> 
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

2. <context:component-scan base-package="com.*" >

     <context:component-scan/> 配置項不但啟用了對類包進行掃描以實施注釋驅動 Bean 定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部注冊了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。

     在這里有一個比較有意思的問題,就是掃描是否需要在二個配置文件都配置一遍,我做了這么幾種測試:

  (1)只在applicationContext.xml中配置如下

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

     掃描到有@RestController、@Controller、@Compoment、@Repository等注解的類,則把這些類注冊為Bean。  

     啟動正常,但是任何請求都不會被攔截,簡而言之就是@Controller失效

  (2)只在spring-servlet.xml中配置上述配置

  啟動正常,請求也正常,但是事物失效,也就是不能進行回滾

  (3)在applicationContext.xml和spring-servlet.xml中都配置上述信息

  啟動正常,請求正常,也是事物失效,不能進行回滾

  (4)在applicationContext.xml中配置如下

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

  在spring-servlet.xml中配置如下

<context:component-scan base-package="com.sohu.login.web" />

  此時啟動正常,請求正常,事物也正常了。

  結論:在spring-servlet.xml中只需要掃描所有帶@Controller注解的類,在applicationContext中可以掃描所有其他帶有注解的類(也可以過濾掉帶@Controller注解的類)。

  詳解      http://blog.csdn.net/gladmustang/article/details/39999721

  3. <mvc:annotation-driven />

  它會自動注冊RequestMappingHandlerMapping 與RequestMappingHandlerAdapter ( 3.1 以后DefaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter已經可以不用了)

  詳情

 

http://www.cnblogs.com/yangzhilong/p/3725849.html

http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null

 

官方文檔: http://docs.spring.io/spring/docs/4.2.2.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-autowired-annotation

區別: http://my.oschina.net/HeliosFly/blog/205343


spring中classpath和classpath*的配置區別

我們以spring中加載properties資源文件為例講解,目錄結構大致如下:

同時 在該項目的lib中添加一個測試的micmiu-test.jar包,jar包中的文件結構如下:

從准備的測試環境中我們可以看到在不同目錄下的四個同名的application.properties資源文件。

[二]、測試代碼:TestClassPath.java  

spring配置文件:applicationContext.xml 中兩種不同的properties文件加載配置:

第一種配置:classpath:

第二種配置: classpath*:

 由此日志信息可知:

  • 同名資源存在時,classpath: 只從第一個符合條件的classpath中加載資源,而classpath*: 會從所有的classpath中加載符合條件的資源
  • classpath*:需要遍歷所有的classpath,效率肯定比不上classpath,因此在項目設計的初期就盡量規划好資源文件所在的路徑,避免使用classpath*來加載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM