annotation-config, annotation-driven, compont-scan 區別

<annotaion-driven/>標籤:java

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

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

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

1.RequestMappingHandlerMappingapp

2.BeanNameUrlHandlerMappingide

3.RequestMappingHandlerAdapterui

4.HttpRequestHandlerAdapterurl

5.SimpleControllerHandlerAdapterspa

6.ExceptionHandlerExceptionResolver.net

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

 

 

本文開門見山,直接分別進行解釋: 
1、<context:annotation-config/> 
隱式地向spring容器中註冊AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 及 equiredAnnotationBeanPostProcessor 這 4 個 BeanPostProcessor 
對這個結果類作個解釋: 
一、若是你想使用@Autowired註解,那麼就必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。 
二、若是想使用@ Resource 、@ PostConstruct、@ PreDestroy等註解就必須聲明CommonAnnotationBeanPostProcessor。 
三、若是想使用@PersistenceContext註解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。 
四、若是想使用 @Required的註解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。 
分別對應的傳統聲明方式爲:

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

通常來講,這些註解咱們仍是比較經常使用,尤爲是Antowired的註解,在自動注入的時候更是常常使用,因此若是老是須要按照傳統的方式一條一條配置顯得有些繁瑣和沒有必要,因而spring給咱們提供 <context:annotation-config> 的簡化配置方式,自動幫你完成聲明。

<context:annotation-config/> 將隱式地向 Spring 容器註冊 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 這 4 個 BeanPostProcessor。

2、 <context:component-scan/> 
<context:component-scan/> 配置項不但啓用了對類包進行掃描以實施註釋驅動 Bean 定義的功能,同時還啓用了註釋驅動自動注入的功能(即還隱式地在內部註冊了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),所以當使用<context:component-scan base-package="xxx.xxx.xxx"/> 後,就能夠將 <context:annotation-config/> 移除了。

默認狀況下經過 @Component 定義的 Bean 都是 singleton 的,若是須要使用其它做用範圍的 Bean,能夠經過 @Scope 註釋來達到目標,如:@Scope(「prototype」),這樣,當從 Spring 容器中獲取 boss Bean 時,每次返回的都是新的實例了。

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

官方文檔中也進行了說明,以下: 
<mvc:annotation-driven/> is a tag added in Spring 3.0 which does the following:

    1. Configures the Spring 3 Type ConversionService (alternative to PropertyEditors)
    2. Adds support for formatting Number fields with @NumberFormat
    3. Adds support for formatting Date, Calendar, and Joda Time fields with @DateTimeFormat, if Joda Time is on the classpath
    4. Adds support for validating @Controller inputs with @Valid, if a JSR-303 Provider is on the classpath
    5. Adds support for support for reading and writing XML, if JAXB is on the classpath (HTTP message conversion with @RequestBody/@ResponseBody)
    6. Adds support for reading and writing JSON, if Jackson is o n the classpath (along the same lines as #5)

      <context:annotation-config/> 
      Looks for annotations on beans in the same application context it is defined and declares support for all the general annotations like @Autowired, @Resource, @Required, @PostConstruct etc etc. 
      <context:annotation-config> does NOT search for @Component, @Controller, etc. 
      <context:component-scan> DOES search for those @Component annotations, as well as the annotations that <context:annotation-config/>does. 
      there are other 「annotation-driven」 tags available to provide additional functionality in other Spring modules. For example,<transaction:annotation-driven /> enables the use of the @Transaction annotation, <task:annotation-driven /> is required for @Scheduled et al

相關文章
相關標籤/搜索