SpringBoot源码(二):@SpringBootApplication注解(自动配置原理)

快速了解

干净的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值