SpringBoot的自动配置原理探究

目录

什么是SpringBoot的自动配置(Auto-Configuration)

举例:SpringBoot自动配置(Redis的自动配置)的实例:

步骤1.:引入Redis启动器pom依赖

步骤2.在application.yml或者(properties,yaml)的配置文件配置redis服务器的连接信息

步骤3.我们就可以通过自动装配 直接使用 RedisTemplate和StringRedisTemplate

 SpringBoot的源码分析:

        步骤一:项目从启动类开始启动,就会实现自动配置,所以我们从启动开始看主动类中只包含了一个run方法(返回IOC容器),和一个@SpringBootApplication注解。

步骤二:@SpringBootApplication 注解内部源码

步骤三:@EnableAutoConfiguration  注解内部源码

步骤四:AutoConfigurationImportSelector.class内部源码内部实现了DeferredImportSelector接口,属于ImportSelector接口的子接口,

 步骤五:getAutoConfigurationEntry方法内部源码内部通过getCandidateConfigurations获取所有的bean对象

 步骤六:getCandidateConfigurations内部源码由其内部断言翻译可知,自动配置是通过  META-INF/spring.factories 的文件实现,它会将此文件内部所有满足条件的Bean交由IOC容器管理,实现自动配置。

总结原理:@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,

当 SpringBoot应用启动时,会自动加载这些配置类,初始化Bean,并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean

自定义(Redis-starter)启动器:要求导入redis坐标时,SpringBoot自动创建Jedis(Java版本API)的bean

步骤一:创建redis-spring-boot-autoconfiguration自动配置模块。

步骤二:创建启动器模块,内部不需要实现任何类,

步骤三:创建我们自己的模块,尝试导入自己建立的启动器,通过打印Jedis依赖,查看是否成功。

运行结果:由结果可知,我们自动启动器成功,并且实现了外部自定义端口和ip


什么是SpringBoot的自动配置(Auto-Configuration)

SpringBoot项目启动后,会将pom.xml中依赖的配置文件中的类交给IOC容器管理,我们就可以通过@Autowired自动装配使用。那么它是怎样实现的,我们下面一起学习了解。

举例:SpringBoot自动配置(Redis的自动配置)的实例:
步骤1.:引入Redis启动器pom依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
步骤2.在application.yml或者(properties,yaml)的配置文件配置redis服务器的连接信息

注意:还可以配置数据库信息,密码等。

spring:
  redis:
    port: 6060 #端口
    host: 127.0.0.2 #ip
步骤3.我们就可以通过自动装配 直接使用 RedisTemplate和StringRedisTemplate

 问题提出:

        整个过程,我们就只通过maven导入了redis的starter启动器依赖,然后就可以直接使用RedisTemplate和StringRedisTemplate等Bean对象,SpringBoot就自动完成了Redis配置,
并且将相关的Bean对象注册加载到IOC容器中了,那么SpringBoot是如何做到的?

 SpringBoot的源码分析:

        步骤一:项目从启动类开始启动,就会实现自动配置,所以我们从启动开始看
主动类中只包含了一个run方法(返回IOC容器),和一个@SpringBootApplication注解。

步骤二:@SpringBootApplication 注解内部源码

步骤三:@EnableAutoConfiguration  注解内部源码

步骤四:AutoConfigurationImportSelector.class内部源码内部实现了DeferredImportSelector接口,属于ImportSelector接口的子接口,

实现ImportSelector接口selectImports方法必须要重写selectImports方法,并返回一个字符串数组,并将字符串数组内部的所有符合条件的类交由IOC管理。

 重写的selectImports方法:其内部还是通过getAutoConfigurationEntry方法获取所有需要自动配置的所有符合条件的类,并转换为String[] 返回。

 步骤五:getAutoConfigurationEntry方法内部源码
内部通过getCandidateConfigurations获取所有的bean对象

 步骤六:getCandidateConfigurations内部源码
由其内部断言翻译可知,自动配置是通过  META-INF/spring.factories 的文件实现,它会将此文件内部所有满足条件的Bean交由IOC容器管理,实现自动配置。

以RedisAutoConfiguration源码观察:它会判断条件,将符合条件的对象交由IOC容器管理

在断言处打断点,debug可知,SpringBoot在启动时,它会把它认知的144个满足条件的类()全部交给IOC容器管理,实现自动配置。

总结原理:
@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。
配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,
当 SpringBoot应用启动时,会自动加载这些配置类,初始化Bean,并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean

自定义(Redis-starter)启动器:要求导入redis坐标时,SpringBoot自动创建Jedis(Java版本API)的bean

        观察Mybatis的自动配置可知,它包含了两个模块,一个自动配置的功能模块,一个依赖管理的启动器模块,我们用只用启动器的依赖管理模块。那么我们定义时,也需要两个模块,一个自动配置模块,一个依赖管理模块

步骤一:创建redis-spring-boot-autoconfiguration自动配置模块。

并在内部pom.xml导入Jedis依赖。

通过配置类,注入jedis 的Bean对象,增加配置文件,给其添加默认的端口,IP,

端口和IP,我们可以导入启动器依赖后,可在项目的配置文件中更改。

RedisAutoconfiguration.java(配置类)

ReidsProperties.java

注意:图中报红,并非错误,不影响,

重点:我们知道,自动配置的文件存在在METE-INF下的spring.factories文件下

//创建此文件,并将我们需要配置的redis自动配置类,放入,让其加载。

导入依赖:

<!--引入jedis依赖-->
<dependencies>

        <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.8.0</version>
</dependency>

步骤二:创建启动器模块,内部不需要实现任何类,

只需要导入我们创建的自动配置模块依赖

 

步骤三:创建我们自己的模块,尝试导入自己建立的启动器,通过打印Jedis依赖,查看是否成功。

 

运行结果:由结果可知,我们自动启动器成功,并且实现了外部自定义端口和ip

好的,我们对于SpringBoot的自动配置学到此处就结束了,如有不足或错误之处,请批评指正。

谢谢!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cph_507

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值