之間的關系


現在常用框架中SpringMVC.xml配置是:

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

那么<context:annotation-config/>呢?


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

① <context:annotation-config/>

1.如果你想使用@Autowired注解,那么就必須事先在 spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

2.如果想使用@Resource 、@PostConstruct、@PreDestroy等注解就必須聲明CommonAnnotationBeanPostProcessor

3.如果想使用@PersistenceContext注解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。

4.如果想使用 @Required的注解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。

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


AutowiredAnnotationBeanPostProcessor、
RequiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor以及
PersistenceAnnotationBeanPostProcessor

<context:annotation- config/>是用來使上述注解起作用的,也就是說激活已經在application context中注冊的bean。 
之所以這樣說是因為<context:annotation-config />僅能夠在已經在已經注冊過的bean上面起作用。對於沒有在spring容器中注冊的bean,它並不能執行任何操作,也就是說如果你並沒有spring容器中注冊過bean(spring配置文件中配置bean就是注冊),那么上述的那些注解並不會在你未注冊過的bean中起作用。


<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就行了。

 


免責聲明!

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



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