咦!Spring容器里为什么没有我需要的Bean?

简介: 【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。

咦!Spring容器里为什么没有我需要的Bean?

小故事

有一天,项目经理收到一个紧急需求,需要新增一个模块,项目经理看了看开发区的同学,一眼就看到盯着屏幕笑嘻嘻的小菜同学

项目经理心想:这傻小子在乐什么呢,肯定是在摸鱼,就让新需求给他做吧

项目经理悄咪咪的偷摸到小菜身后,看着小菜在沸点评论区不停的滑动,似乎在寻找着什么大瓜

此时的小菜似乎察觉到气氛不太对劲,身后似乎有人,于是飞快的按下 Windows + 1 弹出Idea的开发界面

此时,项目经理开口道:小菜啊,这里有个紧急需求,新增了一个模块,你新建一个SpringBoot项目把这些需求写一下吧~

小菜只能不情愿的接到需求,从而放弃摸鱼,开始开发

精通CRUD的小菜立马Copy出一个新项目

image.png

很快啊,啪的一下~写出启动类加上@SpringBootApplication注解

package com.caicaijava.springbooteasyframeworks;

@SpringBootApplication
public class SpringBootEasyFrameworksApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(SpringBootEasyFrameworksApplication.class, args);
    }

}

然后小菜建立了一个controller包开始认真开发...

没过多久,小菜就把需求都搞定了,于是启动服务开始测试

小菜打开测试工具就开始测试接口,但是怎么测试都是404,一开始小菜还以为url写错了,但是检测后发现并没有写错

经过小菜漫长的排查,终于发现了问题:原来是小菜把controller包不小心创建在springbooteasyframeworks包的同级目录

image.png

启动类中的@SpringBootApplication中包含@ComponentScan

@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

@ComponentScan会去扫描包下的组件,并把组件加入到容器中,由于没有配置basePackages字段,于是只会扫描当前包下的组件

当前包也就是com.caicaijava.springbooteasyframeworks

于是controller包与其同级时无法扫描其中的组件,因此导致容器中找不到对应的Bean

如果需要扫描其他包,或者需要依赖公共项目common下的包时,可以使用配置basePackages如果已经配置basePackages则不会默认扫描当前包,于是也要把当前包加上

@SpringBootApplication
@ComponentScan(basePackages = {
   "com.caicaijava.common","com.caicaijava.springbooteasyframeworks"})
public class SpringBootEasyFrameworksApplication {
   

    public static void main(String[] args) {
   
       SpringApplication.run(SpringBootEasyFrameworksApplication.class, args);
    }

}

总结

@SpringBootApplication默认只扫描当前包下的组件,如果需要扫描其他包,需要配置@ComponentScanbasePackagesvalue字段

当配置过@ComponentScan时,默认不会扫描当前包下的组件,注意把当前包也加入配置

🌠最后(一键三连求求拉~)

本篇文章被收入专栏 深入浅出常用框架,感兴趣的同学可以持续关注喔

本篇文章笔记以及案例被收入 Gitee-CaiCaiJavaGithub-CaiCaiJava,除此之外还有更多Java进阶相关知识,感兴趣的同学可以starred持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多技术干货,公众号:菜菜的后端私房菜

相关文章
|
19天前
|
XML 安全 Java
|
2天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
17 6
|
4天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
30 3
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
17天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
48 0
|
6月前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
60 2
|
6月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
70 0
|
2月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
135 1
下一篇
DataWorks