SpringBoot2:配置绑定与自动配置功能源码解读

一、配置绑定

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类中

    @Autowired
    Car 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());
  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值