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

2024-08-16 08:48:48 浏览数 (1)

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

小故事

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

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

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

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

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

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

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

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

代码语言:java复制
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.pngimage.png

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

代码语言:java复制
@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**则不会默认扫描当前包,于是也要把当前包加上

代码语言:java复制
@SpringBootApplication
@ComponentScan(basePackages = {"com.caicaijava.common","com.caicaijava.springbooteasyframeworks"})
public class SpringBootEasyFrameworksApplication {

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

}

总结

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

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

0 人点赞