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