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/>还提供了两个子标签:
- <context:include-filter>
- <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://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
Spring使用ComponentScan扫描Maven多模块工程的其它模块的更多相关文章
- Maven多模块工程打包指定模块工程方法
Maven多模块工程打包指定模块工程执行如下命令: mvn clean package -pl 指定模块工程名 -am 参数说明: -am --also-make 同时构建所列模块的依赖模块:-am ...
- SSM(Spring MVC +Spring+Mybatis)整合——maven工程
所谓的SSM 其实就是Spring MVC下整合mybatis. 具体的定义网络上都有,很详细. 这里只说项目的搭建步骤. 第一步 新建maven工程 工程目录如下: 配置pom.xml文件,引入所需 ...
- 基于tomcat插件的maven多模块工程热部署(附插件源码)
内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...
- Maven的聚合工程(多模块工程)
在开发2个以上模块的时候,每个模块都是一个 Maven Project.比如搜索平台,学习平台,考试平台.开发的时候可以自己管自己独立编译,测试,运行.但如果想要将他们整合起来,我们就需要一个聚合工程 ...
- maven创建web工程Spring配置文件找不到问题解决方案
使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...
- spring启动component-scan类扫描加载过程(转)
文章转自 http://www.it165.net/pro/html/201406/15205.html 有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程 ...
- 【建项目】eclipse maven建立多模块工程
在工作的时候,大多时候都是用Maven来管理项目,可是一般我们都知道怎么用maven管理工程,却不知道通过Maven自己来建立多模块工程.于是自己抽时间,在网上找些资料,做了起来. 建立简单的Mave ...
- maven创建web工程Spring配置文件找不到
使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...
- Eclipse创建Maven多模块工程Module开发(图文教程)
自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/ ...
随机推荐
- JS模块化工具requirejs教程01
转自:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签 ...
- Switf与OC混合开发流程
看着身边越来越多的小伙伴转入Swift,本人也跟随潮流,转战Swift了~下面是初步写入的一个Swift项目框架. 1.创建项目,这个应该不用说了,语言swift 2.CocoaPods 导入第三方 ...
- css做中划线与文字排版
html: <div class="spilt"> <span class="left"></span> < ...
- Flume的安装,配置及使用
1,上传jar包 2,解压 3,改名 4,更改配置文件 将template文件重镜像 root@Ubuntu-1:/usr/local/apache-flume/conf# cat flume-env ...
- 【CF103D】Time to Raid Cowavans(分块)
题意: 思路:院赛防AK题,然而还没来得及做就被数据出锅的题坑了…… #include<cstdio> #include<cstring> #include<string ...
- 【BZOJ】1770 [Usaco2009 Nov]lights 燈
[算法]高斯消元-异或方程组 [题解]良心简中题意 首先开关顺序没有意义. 然后就是每个点选或不选使得最后得到全部灯开启. 也就是我们需要一种确定的方案,这种方案使每盏灯都是开启的. 异或中1可以完美 ...
- python 调用Linux shell
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...
- UVALIVE 3891 The Teacher's Side of Math
One of the tasks students routinely carry out in their mathematics classes is to solve a polynomial ...
- SuSE Linux10.1 网络设置以及和主机通信
SuSE Linux10.1 网络设置以及和主机通信 http://www.cnblogs.com/kevintian/articles/1086994.html 在VMWare上安装好SuSE之后, ...
- JS计算两个日期之间的天数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...