《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
标签: Spring