Spring配置項


<mvc:annotation-driven/>

關於這個標簽,網上很多資料的信息都過時了,還是基於Spring3.1以前的版本(現在最新的是5.1.2),通過調試源碼查看Log並查資料,總結如下:

其對應的實現類:org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

它會向Spring容器中注冊14個Bean,而其中主要的是下面幾個:

1 RequestMappingHandlerMapping
2 BeanNameUrlHandlerMapping
3 RequestMappingHandlerAdapter
4 HttpRequestHandlerAdapter
5 SimpleControllerHandlerAdapter
6 ExceptionHandlerExceptionResolver
7 ResponseStatusExceptionResolver
8 DefaultHandlerExceptionResolver

上面幾個Bean實例,都是用來做什么的呢?

關於它們的詳細功能,在IDEA中將光標移動到AnnotationDrivenBeanDefinitionParser類名上,按Ctrl+q即可查看類文檔。

前兩個是HandlerMapping接口的實現類,用來處理請求映射的

  • 其中第一個是處理@RequestMapping注解的
  • 第二個會將controller類的名字映射為請求url

中間三個是用來處理請求的.具體點說就是確定調用哪個controller的哪個方法來處理當前請求

  • 第一個處理@Controller注解的處理器,支持自定義方法參數和返回值(很酷)
  • 第二個是處理繼承HttpRequestHandler的處理器
  • 第三個處理繼承自Controller接口的處理器

后面三個是用來處理異常的解析器

另外還將提供以下支持:
① 支持使用ConversionService實例對表單參數進行類型轉換; 
② 支持使用@NumberFormatannotation,@DateTimeFormat注解完成數據類型的格式化; 
③ 支持使用@Valid注解對Java bean實例進行JSR 303驗證; 
④ 支持使用@RequestBody和@ResponseBody注解

 

綜上,<mvc:annotation-driven/>標簽主要是用來幫助我們處理請求映射,決定是哪個controller的哪個方法來處理當前請求,以及異常處理。

而在最新的spring項目中,如果不配置<mvc:annotation-driven/>,應用也可以正常處理請求。原因是什么呢?

經過debug DispatcherServlet的源碼,發現如果不配置,spring將從DispatcherServlet.properties這個配置文件中加載默認配置,也是可以將上述的所有類注冊到容器中的。

因此<mvc:annotation-driven/>這個標簽其實是可以省略不寫的。

 

<context:annotation-config/>

這是一條向Spring容器中注冊

AutowiredAnnotationBeanPostProcessor

CommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessor

RequiredAnnotationBeanPostProcessor

這4個BeanPostProcessor.注冊這4個BeanPostProcessor的作用,就是為了你的系統能夠識別相應的注解。

那么哪些注釋依賴這些Bean呢。

如果想使用 @Resource、@PostConstruct、@PreDestroy等注解就必須聲明CommonAnnotationBeanPostProcessor。 
如果想使用 @PersistenceContext注解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。 
如果想使用 @Autowired注解,那么就必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。 
如果想使用 @Required的注解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。

同樣,傳統的聲明方式如下: 

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

但是,就一般而言,這些注解我們是經常使用,比如Antowired,Resuource等注解,如果總是按照傳統的方式一條一條的配置,感覺比較繁瑣和機械。於是Spring給我們提供了<context:annotation-config/>的簡化的配置方式。

注意:即使你使用了<context:annotation-config/>注解,以@Autowired為例,對於需要注入的Bean,仍然還要在xml中手動聲明。這樣很不方便,因此就引出了下面的<context:component-scan>注解。

 

<context:component-scan>

<context:component-scan>首先有和<context:annotation-config/>一樣的作用,此外,它還可以掃描指定包下的類,將擁有注解的它們注冊到Spring容器中。

 

綜上,也就是說,如果用<context:annotation-config/>,我們還需要配置Xml注冊Bean,而使用<context:component-scan />的話,注冊的步驟都免了,當然前提是我們對需要掃描的類使用的注解(比如@Componet,@Service),而如果同時使用兩個配置的話,<context:annotation-config/>會被忽略掉(如果配置了<context:component-scan>,就可以不配置<context:annotation-config/>了)。

 


免責聲明!

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



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