關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄
<context:component-scan>包掃描的坑
公司項目配置的Spring項目的包掃描有點問題,出現(xiàn)了一個被Spring容器管理的Bean被創(chuàng)建了2次的現(xiàn)象。在此記錄下解決的過程,方便后續(xù)查閱。
改動前
容器啟動監(jiān)聽器中會掃描全部包,創(chuàng)建實例
SpringMVC配置文件也會掃描全部包,創(chuàng)建實例
產(chǎn)生的問題:加了注解的類的實例都創(chuàng)建了2個
改動后
容器啟動監(jiān)聽器里面負責非Controller層bean的創(chuàng)建
SpingMVC配置文件里只負責Controller層bean的創(chuàng)建
<context:component-scan>的使用說明
在xml配置了這個標簽后,spring可以自動去掃描base-package下面或者子包下面的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="tv.huan.weisp.web"/>
use-default-filter此時為true那么會對base-package包或者子包下的所有的進行java類進行掃描,并把匹配的java類注冊成bean。
可以發(fā)現(xiàn)這種掃描的粒度有點太大,如果你只想掃描指定包下面的Controller,該怎么辦?此時子標簽context:incluce-filter就起到了用武之地。
如下所示
<context:component-scan base-package="tv.huan.weisp.web .controller"> ? <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> ?? </context:component-scan> ?
這樣就會只掃描base-package指定下的有@Controller下的java類,并注冊成bean
但是因為use-dafault-filter在上面并沒有指定,默認就為true,所以當把上面的配置改成如下所示的時候,就會產(chǎn)生與你期望相悖的結(jié)果(注意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設(shè)置成false就可以了。這樣就可以避免在base-packeage配置多個包名這種不是很優(yōu)雅的方法來解決這個問題了。
另外在我參與的項目中可以發(fā)現(xiàn)在base-package指定的包中有的子包是不含有注解了,所以不用掃描,此時可以指定<context:exclude-filter>來進行過濾,說明此包不需要被掃描。綜合以上說明
use-dafault-filters=”false”的情況下:
<context:exclude-filter>指定的不掃描,<context:include-filter>指定的掃描
定位問題原因* 根據(jù)原因思考問題解決方案* 實踐驗證方案有效性* 提交驗證結(jié)果
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計模式之中介者模式的實現(xiàn)方式
Java中介者模式是一種行為型設(shè)計模式,它通過一個中介者對象來協(xié)調(diào)多個對象之間的交互,降低對象之間的耦合度,提高系統(tǒng)的可維護性和可擴展性。本文將介紹該設(shè)計模式的原理、使用場景和實現(xiàn)方法2023-04-04IDEA2020 1.1中Plugins加載不出來的問題及解決方法
這篇文章主要介紹了IDEA2020 1.1中Plugins加載不出來的問題,本文還給大家提到了IDEA 2020.1.1 找不到程序包和符號的問題,感興趣的朋友跟隨小編一起看看吧2020-06-06spring?@value無法取值多個properties文件的解決
這篇文章主要介紹了spring?@value無法取值多個properties文件的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題(已解決)
這篇文章主要介紹了IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06詳解關(guān)于Spring Cloud 框架熱部署的方法
本篇文章主要介紹了詳解關(guān)于Spring Cloud 框架熱部署的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11