<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/>了)。