首页
点滴
SpringBoot自动装配原理
#### 思考一下自动装配到底是什么??? 其实就是帮我们加载了各种已经写好的Config类文件,实现了这些JavaConfig配置文件的重复利用和组件化!!! SpringBoot主启动类中加了@SpringBootApplication注解,这是一个复合注解。 ![](/images/20210910034946635.png) 进入@SpringBootApplication注解中有三个关键注解分别是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan ![](/images/20210910052005622.png) #### 1、@SpringBootConfiguration @SpringBootConfiguration注解,进入里面可以看到@Configuration注解,该注解代表当前类是配置类,也就是说主启动类也是一个配置类。 ![](/images/20210910052411765.png) #### 2、@ComponentScan @ComponentScan注解用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中 ![](/images/20220216023506859.png) #### 3、@EnableAutoConfiguration @EnableAutoConfiguration意思是开启自动配置,这是最重要最关键的一个注解,它里面有两个关键的注解分别是@AutoConfigurationPackage、@Import `@AutoConfigurationPackage` 指定了默认的包规则,即将当前配置类所在包保存在BasePackages的Bean中,供Spring内部使用。 `@Import(AutoConfigurationImportSelector.class)` 注解的作用是给容器中自动创建括号中的`AutoConfigurationImportSelector`类的组件,默认组件名是全类名。 ![](/images/20220216024747843.png) #### AutoConfigurationImportSelector.class 1、通过@Import注解导入了的AutoConfigurationImportSelector类,该类重写的selectImports方法返回了一个String数组,利用getAutoConfigurationEntry(annotationMetadata)方法给容器中批量导入组件 ![](/images/20220216030301880.png) 2、进入getAutoConfigurationEntry(annotationMetadata)方法,可以看到调用getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入到容器的配置类 ![](/images/20220216030918343.png) 3、进入getCandidateConfigurations(annotationMetadata, attributes)方法,调用loadFactoryNames方法通过工厂加载得到组件 ![](/images/20220216031802971.png) 4、进入loadFactoryNames方法,从下图知道最终找的是类路径下的`META-INF/spring.factories` ![](/images/20220216032622077.png) ![](/images/20220216040448253.png) 这个spring.factories文件是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个XxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示: ![](/images/20220216040842619.png) 也就是说主启动类在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。 #### 自动配置满足条件才生效 在将spring.factories文件中的以AutoConfiguration结尾的配置类加载到容器中后,会在满足某些条件下才生效。条件的限制在Spring Boot中以注解的形式体现,常见的条件注解有以下几个: ``` @ConditionalOnBean:当容器里有指定的bean的条件下。 @ConditionalOnMissingBean:当容器里不存在指定bean的条件下。 @ConditionalOnClass:当类路径下有指定类的条件下。 @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。 @ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。 ``` 这里以ServletWebServerFactoryAutoConfiguration类分析,首先它有@Configuration注解修饰,意味着这个类会注册成为Bean,但是要在满足如下图两个条件的时候才生效 ![](/images/20220216054040212.png) #### 属性如何绑定配置文件 比如在配置文件中我们配置了server.port=8080,那么该web应用的访问端口就是8080,它是如何生效的呢? 如下图@EnableConfigurationProperties注解:开启配置属性。后面的参数是一个ServerProperties类 ![](/images/20220216055511303.png) 进入ServerProperties类,这个类上有@ConfigurationProperties注解,它的作用就是从配置文件中绑定属性到对应的bean上。prefix="server":要绑定属性的前缀,ignoreUnknownFields = true:忽略无法绑定的属性。如果设为false,没有对应属性的话启动会报错。 在ServerProperties类中有个port属性,所以结合前缀server,则配置文件中配置server.port=8080,就能将8080绑定到Spring容器的Bean中。 ![](/images/20220217091135269.png) @ConfigurationProperties属性绑定,配合@Component使用,或者在配置类中(即有@Configuration的类)配合@EnableConfigurationProperties(class)使用,括号里是绑定的类 总结一下,属性绑定就是通过@ConfigurationProperties注解,将配置文件中的属性值绑定到对应的XxxProperties配置实体类上,封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146