文章目录
1.springboot启动扫描包机制
从启动类所在包开始,扫描当前包及其子级包下的所有文件。也就是说你的启动类在哪一层决定着你扫描的类文件多少。这个可以从注解SpringBootApplication中的默认值看到:
其中圈出部分是自己手动指定扫描包路径,如果没有,按照启动类所在路径扫描。
2.如何扫描到其他包
2.1手动增加扫描包
这个应该是大家最能想到的,也是查看资料最先知道的,例如以下示例:
//@Auth//认证
@SpringBootApplication(scanBasePackages={"com.nchu.commom","com.nchu.weather"})
public class WeatherApplication {
public static void main(String[] args) {
SpringApplication.run(WeatherApplication.class, args);
}
//自行封装相关的认证在commom包里,security是空的
}
或者单独使用@ComponentScan注解也是可以的
2.2扫描包配置类
这个和2.1方法其实是一样的,直接给示例吧
@ComponentScans(value =
{@ComponentScan(value = "com.nchu.commom")})
@EntityScan(basePackages = {"com.nchu.weather"})
@Configuration
public class BeanConfigScanConfig implements EnvironmentAware {
@Override
public void setEnvironment(Environment environment) {
}
}
2.3在需要扫描的包配置
首先将需要的注入的类加上注解@Configuration。示例用的是ruoyi开源的微服务框架里的代码
然后再该类所在的包的在resources 文件夹下创建 META-INF 文件夹,在META-INF 文件夹内创建 spring.factories 文件
spring.factories 文件内容如下:
这样子这个包的需要扫描的类就会扫描到。
3.分离启动类扫描包机制
3.1将启动类单独作为一个包
这样子就会把一个应用分成三个包,分别是app(启动类包),business(业务功能包),module(应用模型包)。引用关系分别为module->business->app。如图:这里是我自己本地的一个项目
3.2启动配置
三个模块的pom文件的父级都要是weather这个模块,其次这app模块的pom文件里的不要有 pom,这会引起配置未见application.yml读取失败,然后将business模块加入引用,例如我的weather-app模块的pom就有引用
<dependency>
<groupId>com.nchu</groupId>
<artifactId>weather-business</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
如果不引用,就会被系统扫描不到,加了以后,buiness包和其所引用的commom和module等包就会被扫描到,而且是整个包的加载,在其他包里的控制器,服务器都能拿到,更有利于我们做业务上的分离。
3.3 注意路径
从下图可以看到,启动类所在的包路径在更上的一层,因为这样子的使用是破坏了原有的扫描包规则的,该应用启动时会把引用的包做路径的比对,发现是更低的一层,就能成功扫描进来。包括公共包commom模块的路径是com.nchu.commom。
3.4 这样子做的好处
在一个大的项目中,我们有着多个服务,但是却要在为一些公共的服务做相同的配置,例如json序列化配置,redis配置,以及认证配置等,而业务功能实现过程中,也避免不了的使用到这些,我们就可以在buiness模块直接引入公共包使用,应用启动就会自动扫描。
但是这里的buiness模块是不能被其他服务使用的,否则控制器controller都会被其他的应用服务载入,而且多个服务之间的业务隔离,是不能直接引入其他服务biness使用的,需要服务自己提供api供其他服务引入调用。
如果是公共的接口,比如文件上传下载要么单独做成服务,要么把该controller放到commom里,让其他模块引入。