<context:annotation-config/>,作用是式地向 Spring 容器註冊
AutowiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor、
RequiredAnnotationBeanPostProcessor
這4個BeanPostProcessor,註冊這4個BeanPostProcessor的作用
如果你想使用@Autowired注解,那麼就必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。傳統聲明方式如下:
<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
如果想使用@Resource 、@PostConstruct、@PreDestroy等注解就必須聲明CommonAnnotationBeanPostProcessor
如果想使用@PersistenceContext注解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。
如果想使用@Required的注解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。同樣,傳統的聲明方式如下:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
一般來說,這些注解我們還是比較常用,尤其是Antowired的注解,在自動注入的時候更是經常使用,所以如果總是需要按照傳統的方式一條一條配置顯得有些繁瑣和沒有必要,於是spring給我們提供<context:annotation-config/>的簡化配置方式,自動幫你完成聲明。
不過,我們使用注解一般都會配置掃描包路徑選項
<context:component-scan base-package="XX.XX"/>
該配置項其實也包含了自動注入上述processor的功能,因此當使用 <context:component-scan/> 後,就可以將 <context:annotation-config/> 移除了。
在xml配置了這個標籤後,spring可以自動去掃描base-pack下面或者子包下面的java檔,如果掃描到有@Component、@Controller、@Service等這些注解的類,則把這些類註冊為bean
注意:如果配置了<context:component-scan>那麼<context:annotation-config/>標籤就可以不用再xml中配置了,因為前者包含了後者。另外<context:annotation-config/>還提供了兩個子標籤
<context:include-filter>
<context:exclude-filter>
在說明這兩個子標籤前,先說一下<context:component-scan>有一個use-default-filters屬性,改屬性預設為true,這就意味著會掃描指定包下的全部的標有@Component的類,並註冊成bean.也就是@Component的子注解@Service,@Reposity等。所以如果僅僅是在設定檔中這麼寫
<context:component-scan base-package="xx.xx.xx.web"/>
use-default-filter此時為true那麼會對base-package包或者子包下的所有的進行java類進行掃描,並把匹配的java類註冊成bean。
可以發現這種掃描的細微性有點太大,如果你只想掃描指定包下面的Controller,該怎麼辦?此時子標籤<context:incluce-filter>就起到了勇武之地。如下所示
<context:component-scan base-package="xx.xx.xx.web.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
這樣就會只掃描base-package指定下的有@Controller下的java類,並註冊成bean
但是因為use-dafault-filter在上面並沒有指定,默認就為true,所以當把上面的配置改成如下所示的時候,就會產生與你期望相悖的結果(注意base-package包值得變化)
<context:component-scan base-package="xx.xx.xx.web">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
此時,spring不僅掃描了@Controller,還掃描了指定包所在的子包service包下注解@Service的java類
此時指定的include-filter沒有起到作用,只要把use-default-filter設置成false就可以了。這樣就可以避免在base-packeage配置多個包名這種不是很優雅的方法來解決這個問題了。
<!-- 以下不掃瞄 -->
<context:exclude-filter type="regex" expression="xx.xx.*"/>
此時,spring不僅掃描了@Controller,還掃描了指定包所在的子包service包下注解@Service的java類
此時指定的include-filter沒有起到作用,只要把use-default-filter設置成false就可以了。這樣就可以避免在base-packeage配置多個包名這種不是很優雅的方法來解決這個問題了。
<!-- 以下不掃瞄 -->
<context:exclude-filter type="regex" expression="xx.xx.*"/>
沒有留言:
張貼留言