目录
什么是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的自动配置学到此处就结束了,如有不足或错误之处,请批评指正。
谢谢!