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

咦!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持续关注喔~

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值