springboot启动类分离,可以扫描其他包的类注入容器

本文详细介绍了SpringBoot启动时的包扫描机制,包括默认从启动类所在包开始扫描,以及如何通过手动配置、@ComponentScan和配置类来指定额外的扫描包。此外,还分享了如何通过将启动类与业务包分离,实现模块化和更好的包管理,以提高项目的可维护性和解耦。同时,这种方式有利于公共模块的复用和业务隔离。
摘要由CSDN通过智能技术生成

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里,让其他模块引入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值