快速了解
干净的SpringBoot启动类:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication
注解的组成:(有3条重要信息)
//..
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
1、@SpringBootConfiguration
:其实就是 @Configuration 的组合注解(简单的理解:一个类如果标注了@SpringBootConfiguration,也就相当于标注了@Configuration)
这就说明SpringBoot的启动类可以作为一个配置类:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
// 可以定义@Bean方法,向容器中注入组件
@Bean
Student student(){
return new Student();
}
}
2、@ComponentScan
:由此可以知道,组件扫描的是启动类所在的包及其子包下的组件,所以,我们平常定义的@Controller、@Service… 等,必须要定义在启动类所在的包及其子包下,这样才能被扫描到
3、@EnableAutoConfiguration
:(参考 “官网-使用 SpringBoot 进行开发”)
将 @EnableAutoConfiguration 添加到你的 @Configuration 类上,就可以开启自动配置功能 (建议添加到主要的 @Configuration 类上)
自动配置:
① SpringBoot 的自动装配机制会试图根据你所添加的依赖来自动配置你的 Spring 应用程序。例如,你添加了 HSQLDB 依赖,而且你没有手动配置任何 DataSource Bean,那么SpringBoot就会自动配置内存数据库。
② 自动配置是非侵入性的。 在任何时候,你都可以自定义配置来取代自动配置的特定部分。 例如,如果你添加了你自己的 DataSource bean,默认的嵌入式数据库支持就会 “退步”,从而让你的自定义配置生效。
③ 如果你想禁用掉项目中某些自动装配类,你可以在 @SpringBootApplication 注解的 exclude 属性中指定,如下例所示:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class })
public class MyApplication {
}
如果要禁用的自动装配类不在classpath上(没有导入),那么你可以在注解的 excludeName 属性中指定类的全路径名称。 【注】exclude 和 excludeName 属性在 @EnableAutoConfiguration 中也可以使用。
最后,你也可以在配置文件中通过 spring.autoconfigure.exclude[] 配置来定义要禁用的自动配置类列表。
被 @EnableAutoConfiguration / @SpringBootApplication注解标注的类,其所在的包有特殊的含义,通常被定义为 “默认值” ,这个默认值体现在:组件扫描、JPA实体类扫描、Mapper接口扫描等
原理部分
@EnableAutoConfiguration (自动装配)
@EnableAutoConfiguration 注解本身包含了两部分:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
1、@AutoConfigurationPackage
@AutoConfigurationPackage 所做的工作就是将主启动类所在的包(根包)记录下来,将其封装为一个BasePackages Bean,注入容器中。
为什么 SpringBoot 要执着于记录应用的根包呢?因为这个根包路径在整合第三方 starter 时,有特殊作用
注:在 SpringBoot 2.3.0 版本及之后,注解中多了两个属性:basePackages、basePackageClasses,配置它们可以手动指定应用的根包/根路径。如果没有手动配置,那么就采用默认的主启动类所在的包)
@Import(AutoConfigurationPackages.Registrar.clas