現在常用框架中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就行了。