Spring使用ComponentScan掃描Maven多模塊工程的其它模塊


說明:在新建好了Maven多模塊工程后,如果想要在其它模塊也能使用Spring的對象管理,比如@Autowrited這些注入方式,那么就必須開啟包掃描的功能才能使其進行注入到Spring的對象管理中。

解決方法:

1、在Spring中配置ComponentScan的掃描包范圍,把要加入的的Module包路徑添加進去即可實現注入。

解釋:

一、對於XML的配置:

在XML配置了這個標簽后,Spring可以自動去掃描base-pack下面或者子包下面的java文件,如果掃描到有@Component @Controller@Service等這些注解的類,則把這些類注冊為Bean。

注意:如果配置了<context:component-scan>那么<context:annotation-config/>標簽就可以不用再XML中配置了,因為前者包含了后者。另外<context:annotation-config/>還提供了兩個子標簽:

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

在說明這兩個子標簽前,先說一下<context:component-scan>有一個use-default-filters屬性,該屬性默認為true,這就意味着會掃描指定包下的全部的標有@Component的類,並注冊成Bean。也就是@Component的子注解@Service,@Reposity等。所以如果僅僅是在配置文件中這么寫:

<context:component-scan base-package="com.jsoft.web"/>

Use-default-filter此時為true那么會對base-package包或者子包下的所有的進行java類進行掃描,並把匹配的java類注冊成Bean。

可以發現這種掃描的粒度有點太大,如果你只想掃描指定包下面的Controller,該怎么辦?此時子標簽<context:incluce-filter>就起到了用武之地。如下所示:

<context:component-scan base-package="com.jsoft.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="com.jsoft.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>指定的掃描范圍。

二、對於注解方式的使用,多數用於Spring Boot項目或者零配置的Spring MVC項目

其實本質都是一樣的,只是寫法不一樣而已。

@EnableAutoConfiguration: 

根據項目所使用的依賴自動進行配置。同時使用這個注解時,會默認在項目啟動時掃描當前包及其子包下。同時也可以在@CompentScan注解中配置baskPackage屬性來完成設置。如果自動完成的配置中包含了我們不需要的部分,則可以使用注解中的exclude屬性來剔除。 

@CompentScan: 

配置自動掃描,如果不配置任何屬性則掃描當前包及其子包。 

@Configuration: 

此注解標注了一個類為配置類。在使用SpringBoot時不需要在一個類中完成所有的配置。可以通過此注解標注並使該類可以被掃描,或者使用@Import注解來進行導入配置。另外,在使用xml來進行配置時可以通過使用@ImportResource來導入。 

@SpringBootApplication: 

相當於默認配置下的@EnableAutoConfiguration+@CompentScan+@Configuration,因為這三個注解經常同時使用,所以Spring給了一個簡單的方式來完成使用。 

 

參考:

http://blog.csdn.net/fewmore/article/details/50725412(以上內容部分轉自此篇文章)

http://blog.csdn.net/shenqingxiao/article/details/53897255(以上內容部分轉自此篇文章)

https://stackoverflow.com/questions/46784051/spring-boot-multi-module-project-load-property-file

https://stackoverflow.com/questions/12961394/how-to-autowire-service-in-another-module

https://stackoverflow.com/questions/34941862/spring-boot-configuration-in-a-multi-module-maven-project

https://stackoverflow.com/questions/33229793/how-to-add-multiple-application-properties-files-in-spring-boot

https://stackoverflow.com/questions/40384056/consider-defining-a-bean-of-type-package-in-your-configuration-spring-boot

https://www.cnblogs.com/maybo/p/5189516.html

http://blog.csdn.net/xieyuooo/article/details/9089441

http://blog.csdn.net/u011659172/article/details/51323066

http://jinnianshilongnian.iteye.com/blog/1762632

https://stackoverflow.com/questions/30970748/multiple-componentscan-in-spring-4

https://www.jianshu.com/p/752e2ba89dc3

http://blog.csdn.net/u013041642/article/details/78934157

http://blog.csdn.net/wolf2s/article/details/64473922

http://blog.csdn.net/ttjxtjx/article/details/49866011


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM