,和之間的關係

如今經常使用框架中SpringMVC.xml配置是:web

<mvc:annotation-driven/>和<context:component-scan>spring

那麼<context:annotation-config/>呢?mvc


首先看一下三個註解各自定義:app

① <context:annotation-config/>

1.若是你想使用@Autowired註解,那麼就必須事先在 spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。框架

2.若是想使用@Resource 、@PostConstruct、@PreDestroy等註解就必須聲明CommonAnnotationBeanPostProcessorui

3.若是想使用@PersistenceContext註解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。url

4.若是想使用 @Required的註解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。spa

使用<context:annotation- config/>隱式地向 Spring容器註冊這4個BeanPostProcessor :.net

AutowiredAnnotationBeanPostProcessor、
RequiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor以及
PersistenceAnnotationBeanPostProcessor

<context:annotation- config/>是用來使上述註解起做用的,也就是說激活已經在application context中註冊的bean。 
之因此這樣說是由於<context:annotation-config />僅可以在已經在已經註冊過的bean上面起做用。對於沒有在spring容器中註冊的bean,它並不能執行任何操做,也就是說若是你並無spring容器中註冊過bean(spring配置文件中配置bean就是註冊),那麼上述的那些註解並不會在你未註冊過的bean中起做用。code


<context:component-scan>

<context:component-scan>作了<context:annotation-config>要作的事情,還額外支持@Component,@Repository,@Service,@Controller註解。
而且<context:component-scan>掃描base-package而且在application context中註冊掃描的beans.

因此配置<context:component-scan>就不須要配置<context:annotation- config/>


③ <mvc:annotation-driven/>

至於該項看前綴就應該知道是springmvc所須要的註解。

<mvc:annotation-driven/>至關於註冊了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter兩個bean,配置一些messageconverter。即解決了@Controller註解的使用前提配置。

咱們找到對應的實現類是:

org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser。

經過閱讀類註釋文檔,咱們發現這個類主要是用來向工廠中註冊了

  • RequestMappingHandlerMapping
  • BeanNameUrlHandlerMapping
  • RequestMappingHandlerAdapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter
  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • DefaultHandlerExceptionResolver

上面幾個Bean實例。這幾個類都是用來作什麼的呢?

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

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

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

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

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

另外還將提供如下支持:

① 支持使用ConversionService實例對錶單參數進行類型轉換; 
② 支持使用@NumberFormatannotation、@DateTimeFormat註解完成數據類型的格式化; 
③ 支持使用@Valid註解對Java bean實例進行JSR 303驗證; 
④ 支持使用@RequestBody和@ResponseBody註解

 

轉自:http://blog.csdn.net/sunhuwh/article/details/25558867

<annotaion-driven/>標籤:

這個標籤對應的實現類是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

仔細閱讀它的註釋文檔能夠很明顯的看到這個類的做用。解析這個文檔:

這個類主要註冊8個類的實例:

1.RequestMappingHandlerMapping

2.BeanNameUrlHandlerMapping

3.RequestMappingHandlerAdapter

4.HttpRequestHandlerAdapter

5.SimpleControllerHandlerAdapter

6.ExceptionHandlerExceptionResolver

7.ResponseStatusExceptionResolver

8.DefaultHandlerExceptionResolver

1是處理@RequestMapping註解的,2.將controller類的名字映射爲請求url。1和2都實現了HandlerMapping接口,用來處理請求映射。

3是處理@Controller註解的控制器類,4是處理繼承HttpRequestHandlerAdapter類的控制器類,5.處理繼承SimpleControllerHandlerAdapter類的控制器。因此這三個是用來處理請求的。具體點說就是肯定調用哪一個controller的哪一個方法來處理當前請求。

6,7,8所有繼承AbstractHandlerExceptionResolver,這個類實現HandlerExceptionResolver,該接口定義:接口實現的對象能夠解決處理器映射、執行期間拋出的異常,還有錯誤的視圖。

因此<annotaion-driven/>標籤主要是用來幫助咱們處理請求映射,決定是哪一個controller的哪一個方法來處理當前請求,異常處理。

 

<context:component-scan/>標籤:

它的實現類是org.springframework.context.annotation.ComponentScanBeanDefinitionParser.

把鼠標放在context:component-scan上就能夠知道有什麼做用的,用來掃描該包內被@Repository @Service @Controller的註解類,而後註冊到工廠中。而且context:component-scan激活@ required。@ resource,@ autowired、@PostConstruct @PreDestroy @PersistenceContext @PersistenceUnit。使得在適用該bean的時候用@Autowired就好了。

相關文章
相關標籤/搜索