《Spring编程常见50例》学习笔记 Day9
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
对于SpringBoot而言,关键点在于Application.java 中使用了SpringBootApplication注解,这个注解集成了另外一些注解,具体如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
//省略非关键代码
}
通过定义看出SpringBootApplication
开启了很多功能,其中跟这个问题有关的就是ComponentScan
,参考配置如图下:
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)
在SpringBoot启动的时候,ComponentScan
的启动意味着会去扫描所有定义的Bean,扫描的范围由ComponentScan
注解的basePackages
属性指定的,具体代码:
public @interface ComponentScan {
/**
* Base packages to scan for annotated components.
* <p>{@link #value} is an alias for (and mutually exclusive with) this
* attribute.
* <p>Use {@link #basePackageClasses} for a type-safe alternative to
* String-based package names.
*/
@AliasFor("value")
String[] basePackages() default {};
//省略其他非关键代码
}
我们可以看到默认是空,如果我们不指定就是空,此时扫描的包就是declaringClass
所在的包,declaringClass
一般就是Application.class
,所以不指定扫描的包就是Application所在的包。
问题修正
通过上边的分析,我们可以显式配置@ComponentScan
,如:
@SpringBootApplication
@ComponentScans(value = { @ComponentScan(value = "com.spring.demo.class.example.controller") })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
ComponentScans
支持多个包的扫描范围定义,需要注意的是以 ComponentScan 为例,原有的代码扫描了默认包而忽略了其它包;而一旦显式指定其它包,原来的默认扫描包就被忽略了。
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |