spring 使用說明(轉)

spring context:component-scan使用說明(轉) 在xml配置了這個標籤後,spring能夠自動去掃描base-pack下面或者子包下面的java文件,若是掃描到有@Component @Controller@Service等這些註解的類,則把這些類註冊爲beanjava

注意:若是配置了context:component-scan那麼context:annotation-config/標籤就能夠不用再xml中配置了,由於前者包含了後者。另外context:annotation-config/還提供了兩個子標籤web

  1. <context:include-filter>
  2. <context:exclude-filter>

在說明這兩個子標籤前,先說一下context:component-scan有一個use-default-filters屬性,改屬性默認爲true,這就意味着會掃描指定包下的所有的標有@Component的類,並註冊成bean.也就是@Component的子註解@Service,@Reposity等。因此若是僅僅是在配置文件中這麼寫spring

<context:component-scan base-package="tv.huan.weisp.web"/>express

Use-default-filter此時爲true那麼會對base-package包或者子包下的全部的進行java類進行掃描,並把匹配的java類註冊成bean。.net

能夠發現這種掃描的粒度有點太大,若是你只想掃描指定包下面的Controller,該怎麼辦?此時子標籤context:incluce-filter就起到了勇武之地。以下所示code

<context:component-scan base-package="tv.huan.weisp.web .controller">component

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>xml

</context:component-scan>blog

這樣就會只掃描base-package指定下的有@Controller下的java類,並註冊成beanget

可是由於use-dafault-filter在上面並無指定,默認就爲true,因此當把上面的配置改爲以下所示的時候,就會產生與你指望相悖的結果(注意base-package包值得變化)

<context:component-scan base-package="tv.huan.weisp.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配置多個包名這種不是很優雅的方法來解決這個問題了。

另外在我參與的項目中能夠發如今base-package指定的包中有的子包是不含有註解了,因此不用掃描,此時能夠指定context:exclude-filter來進行過濾,說明此包不須要被掃描。綜合以上說明

Use-dafault-filters=」false」的狀況下:context:exclude-filter指定的不掃描,context:include-filter指定的掃描

源:http://blog.csdn.net/chunqiuwei/article/details/16115135

相關文章
相關標籤/搜索