当前位置: 首页 > news >正文

SpringBoot类跨包扫描失效的几种解决方法

前置问题

当我们用 @compoent 注解时,注解需要被 Spring的组件扫描扫描到。@SpringBootApplication 具有包扫描的作用 ,但是扫描范围只有当前包及其子包

列子

MvcConfig 这个配置类需要在 user-service 中使用。我们启动 user-service 会报扫描不到 MvcConfig 这个配置类

在这里插入图片描述
在这里插入图片描述

解决办法

第一种:直接使用 @ComponentScan 组件扫描


在引用了配置类的类的启动类中使用 @ComponentScan 手动扫描
注意自己默认的扫描会被覆盖。所以要手动加入自己默认的扫描,也就是当前包及子包

因为麻烦,性能差所以不推荐

  • UserApplication
@ComponentScan(basePackages = {"com.hmall.common.config", "com.hmall.user"})
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

第二种:使用 @Import 直接导入


  • UserApplication
@Import(MvcConfig.class)
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

第三种:@Import 导入 ImportSelector 接口实现类


  • hm-common 中定义 ImportSelector 实现类
public class MyImportSelector implements ImportSelector {
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[] {"com.example.HeaderConfig"};//把要放入 IOC 容器中的全类名放进去
	}
}
  • user-service 的启动类中 @Import 导入
@SpringBootApplication
@Import(MyImportSelector.class)
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

}

第四种:直接写入 META-INF 自动配置文件


  • SpringBoot2META-INF/spring.factories
  • SpringBoot3META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

这里以 SpringBoot2 为例

  • META-INF/spring.factories

SpringBoot 已启动就会读取这里的列出的类。自动加载到 IOC 中,即使这些配置类所在的包不在扫描范围内

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.hmall.common.config.MyBatisConfig,\
  com.hmall.common.config.JsonConfig,\
 //这里新增了 MvcConfig
  com.hmall.common.config.MvcConfig
  • 我们也可以限制什么时候自动加载这个类

使用 ConditionalOnClass。这里就是只有在 SpringMVC 环境下才加载,在其他环境不加载例如响应式环境

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInfoInterceptor());
    }
}

相关文章:

  • SpringBoot企业级开发之【用户模块-登录】
  • 群晖NAS的最好的下载软件/电影的方式(虚拟机安装win系统安装下载软件)
  • 【5分钟论文阅读】InstructRestore论文解读
  • linux-core分析 : sip变量赋值-指针悬挂
  • 【LeetCode】算法详解#3 ---最大子数组和
  • 人工智能新时代:从深度学习到自主智能
  • 人工智能:深度学习关键技术与原理详解
  • LeetCode 解题思路 30(Hot 100)
  • 硬盘分区格式之GPT(GUID Partition Table)笔记250407
  • 【k8s学习之CSI】理解 LVM 存储概念和相关操作
  • 喂饭教程-Dify如何集成RAGFlow知识库
  • [ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解
  • Token+JWT+Redis 实现鉴权机制
  • 2024年十五届蓝桥杯青少年Scratch省赛初级组——找不同
  • 极空间NAS进阶玩法:Debian 系统安装教程
  • Docker学习--卷相关命令
  • 瓦片数据合并方法
  • 【R语言绘图】圈图绘制代码
  • 分割回文串 复原IP地址(Java)
  • 光场调制技术在超快激光加工中的应用
  • 体坛联播|巴萨提前2轮西甲夺冠,郑钦文不敌高芙止步4强
  • 音乐节困于流量
  • 俄外交部:俄乌伊斯坦布尔谈判改在当地时间15日下午举行
  • 从这些电影与影像,看到包容开放的上海
  • 人民日报访巴西总统卢拉:“巴中关系正处于历史最好时期”
  • 全球医药股普跌,A股创新药板块下挫