一、配置绑定
1、作用说明
我们在开发springboot
项目时,会有个配置文件,application.properties
文件。
我们知道,像什么访问端口、上传功能的相关配置,都会在这里进行配置。
而这些,都是springboot
自带的或者第三方jar
包的属性。
那么,我们怎么给自己定义的Bean
属性配置属性值了?
这里,就用到配置绑定功能。
2、实现方式
2.1、@Component + @ConfigurationProperties方式(推荐使用)
自定义bean
@ToString
@Data
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {private String brand;private Integer price;}
application.properties
文件中
mycar.brand=YD
mycar.price=100000
controller
类中
@AutowiredCar car;@RequestMapping("/car")public Car car(){return car;}
注意,使用@ConfigurationProperties
注解,IDEA
可能会报提示
解决办法:
File | Settings | Languages & Frameworks | Spring | Spring Boot
2.2、@EnableConfigurationProperties + @ConfigurationProperties方式
使用说明:
这种方式,需要再配置类上使用@EnableConfigurationProperties
注解,然后,在自定义bean
上使用@ConfigurationProperties
注解
配置类:
bean
:
二、自动配置功能源码解读
我们启动springboot
项目的时候,就自动注册到IOC
容器中很多的组件。
那么,这是如何实现的?
多少组件被注册?这些信息写在那个配置文件中了?组件的自定义配置怎么关联上的?
带着这些问题,我们来学习一下springboot
的自动配置功能源码。
1、从启动类开始
@SpringBootApplication这个注解等价于下面三个注解@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
1.1、@SpringBootConfiguration
这个注解被@Configuration
标注,所以,它是个配置类。
没什么内容。
和注册组件没关系。
1.2、@ComponentScan
这个注解,我们都知道,是扫描包的路径。
一般是针对于我们开发人员,在该路径下,加了注解的类,会被注册到容器中。
所以,和springboot
的内部组件注册无关。
1.3、@EnableAutoConfiguration
这个注解,实际上是负责springboot
的自动配置功能的。
它等价于下面两个注解:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
1.3.1、@AutoConfigurationPackage
这个注解的作用是获取启动类的包路径
,然后,进行用户组件扫描并注册。
我们在124行打上断点。
会发现,获取了启动类的包路径
这就是,为什么我们的springboot
默认扫描路径是启动类
所在路径及其子路径。
1.3.2、@Import(AutoConfigurationImportSelector.class)
可以发现,这里的@Import注解,将spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面的一个类,注册到IOC
容器中。
我们,进入这个类中
找到selectImports
方法
进入getAutoConfigurationEntry
方法
进入getCandidateConfigurations
方法
代码:
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());