SpringBoot自动配置原理和实践

一、什么是SpringBoot的自动配置

SpringBoot自动配置,英文是Auto-Configuration

        - 它是指基于你引入的依赖jar包,对SpringBoot应用进行自动配置

        - 它为SpringBoot框架的"开箱即用"提供了基础支撑

注意:

        “自动配置” 和 “自动装配” 概念不要混淆:

        1.自动配置,是Auto-Configuration,针对的是SpringBoot中的配置类;

        2.自动装配,是Autowire,针对的是Spring中的依赖注入。

术语:

        “配置类”,英文是Configuration Class:

        - 广义的“配置类”:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括了@Configuration类

        - 狭义的“配置类”:特指被@Configuration所修饰的类,又称为@Configuration类

二、SpringBoot自动配置的实例

Redis的自动配置

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、配置Redis服务器

spring:

    redis:

      database: 0

      host: 127.0.0.1

      port: 6379

      password: 123456

3、直接使用RedisTemplate 或 StringRedisTemplate 等Bean对象

@Autowired
private RedisTemplate<Object,Object> redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;,

整个过程中,我们除了通过Maven引入一个starter外,其他什么也没有做,但是SpringBoot就自动完成了Redis的配置,将相关的Bean对象注册到IoC容器中了。

三、SpringBoot的启动流程

自动配置作为SpringBoo启动的一部分,我们有必要从全局的角度去理解它。

SpringBoot启动流程的简化版代码:

public static void run(Class<?> primaryClass) {
        //1.创建一个ApplicationContext实例,即我们常说的IoC容器
        ApplicationContext context = createApplicationContext();
        //2.将主类(primaryClass)注册到IoC容器中(简单但重要的第一步)
        loadSourceClass(context,primaryClass);
        //3.递归加载并处理所有的配置类
        processConfigurationClasses(context);
        //4.实例化所有的单例Bean(Singleton Bean)
        instantiateSingletonBean(context);
        //5.如果是web应用,则启动web服务器(例如Tomcat)
        startWebServer(context);
    }

 

 四、SpringBoot加载配置类的流程

SpringBoot加载配置类流程的简化版:

1、@Component注解

        - 它的作用是对指定的package进行扫描,找到其中符合条件的类,默认是搜索被注解@Component修饰的配置类

        - 通过属性basePackages 或 basePackagesClasses,来指定要进行扫描的package

        -如果未指定package,则默认扫描当前@ComponentScan所修饰的类所在的package

2、@Import注解

        - 它的作用是提供一种显示地从其他地方(第三方jar包)加载配置类的方式,这样可以避免使用性能较差的扫描组件(Component Scan)

        - 支持导入:

                普通类(这里的“普通”,是相对于随后的两个接口而言的);

                接口ImportSelector的实现类;

                接口ImportBeanDefinitioneRegistrar的实现类。

总结一下SpringBoot加载配置类的方式(实现自动配置):

使用注解@Import,导入选择器 ImportSelector,非常适合用来实现自动配置。

五、SpringBoot自动配置的原理剖析

1、结论:SpringBoot使用注解@Import,导入一个ImportSelector,从而实现了自动配置的功能。

2、注解@SpringBootSpplication结构图:

3、如何实现类AutoConfigurationImportSelector

        😜SpringFactories机制

        ✔ Java SPI机制的延伸和拓展

        ✔Spring框架的基础机制,在Spring以及SpringBoot源码中到处可见

        ✔可以基于它来实现SpringBoot的自动配置功能

        😜它的核心逻辑是从classpath中读取到所有的Jar包中的配置文件 META-IF/spring.factories,然后根据指定的Key从配置文件中解析出对应的value值

4、机制比较

5、 AutoConfigurationImportSelector的实现流程:

 六、总结

SpringBoot启动时,会自动递归加载和处理所有的配置类(@Component和@Import)。通过@EnableAutoConfiguratio引入AutoConfigurationImportSelector选择器,使用其selectImports()方法,通过Spring Factories机制(通过ClassLoader去获取classpath中的配置文件META-IF/spring.factories)加载配置文件,找出所有的自动配置类(筛选出以EnableAutoConfiguration.class为key的,符合条件的配置类)。根据注解@Conditional过滤掉不必要的自动配置类,完成了自动配置。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值