=========================================================================
创建一个普通的springboot工程:
在yaml数据格式笔记中我们学过,该ConfigurationProperties注解的作用:就是通过该注解把yml配置文件中的数据封装到实体类的属性当中,注意:yml配置文件中的数据属性名要和实体类当中的属性名一致,要不然封装不上数据(忘记的话看笔记)
代码演示ConfigurationProperties注解的作用如下所示:
yml配置文件中的数据如下所示:
实体类MyDataEnterprise:
- package com.Bivin.config;
-
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- /**
- * MyDataEnterprise类: 该类就是用来获取封装yml配置文件中的数据的
- *
- * 注意一:一定要保证该类中的属性名要和yml配置文件的配置名一致,要不然封装不到数据
- *
- * 注意二:把该实体类配置成bean注解的目的是因为:该实体类是用来封装yml配置文件中的一些数据的,
- * 所以应该受spring管控,因此配置成bean的形式
- *
- * 注意三:@ConfigurationProperties(prefix = "servers")注解的作用:就是获取yml配置文件中的
- * servers里面的数据,把yml配置文件中的servers里面的数据封装到该实体类的属性中
- * (要保证servers里面的属性名和实体类中的属性名一致才能进行封装获取)
- */
-
- @Data // 该注解是快速开发实体类的(使用该注解不用再写toString、getter、setter方法了,已经写好了)别忘记导lombok坐标
- @Component // bean注解
- @ConfigurationProperties(prefix = "servers")
- public class MyDataEnterprise {
-
- private String ipAddress;
- private int port;
- private long timeout;
-
- }
springboot引导类(也可以获取bean对象,忘记的话看前面笔记):
会发现,通过ConfigurationProperties注解,yml配置文件中的数据确实封装到了实体类的属性当中了。
思考:上面我们用一个 bean(bean:对象) 加上ConfigurationProperties注解的时候,可以把yml配置文件中的一些数据封装到该bean的属性当中,我们上面演示的是自定义的bean,如果这个bean不是我们自定义的呢?假如是一个第三方的bean呢:
因此第三方bean的时候,通过该注解形式如何把yml配置文件中的数据封装到第三方bean的属性当中呢:
模拟第三方bean:Druid (别忘记导入Druid的坐标)
代码演示如下所示:
下面演示的代码只不过是把第三方bean写在了引导类当中的@Bean注解当中了,实际意思还是和我们自定义的bean的意义是一样的:
- package com.Bivin;
-
- import com.Bivin.config.MyDataEnterprise;
- import com.alibaba.druid.pool.DruidDataSource;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.ConfigurableApplicationContext;
- import org.springframework.context.annotation.Bean;
-
- @SpringBootApplication
- public class Springboot07ConfigurationApplication {
-
-
- /**
- * 第三方bean: Druid
- *
- * 在这里使用@Bean注解 和 上面我们自定义的bean形式是一样的
- * 相当于说MyDataEnterprise的代码在这里面写了
- */
- @Bean
- public DruidDataSource dataSource(){
- DruidDataSource dataSource = new DruidDataSource();
- // 手动给第三方bean的属性(driverClassName属性)赋值
- dataSource.setDriverClassName("com.mysql.jdbc.Driver123");
- return dataSource;
- }
-
-
- public static void main(String[] args) {
-
- ConfigurableApplicationContext run = SpringApplication.run(Springboot07ConfigurationApplication.class, args);
-
- // 获取bean
- DruidDataSource bean = run.getBean(DruidDataSource.class);
-
- // 获取bean对象的DriverClassName属性值
- System.out.println(bean.getDriverClassName());
- }
-
- }
但是思考:我们第三方bean的属性值是我们手动进行赋值的,我们能不能把第三方bean的属性值写在yml配置文件中,然后通过某种注解,封装到第三方bean的属性中呢:
当然可以演示如下所示:(同样要保证yml配置文件中的配置名要和bean的属性名一致,要不然封装不上数据)
通过ConfigurationProperties注解,把yml配置文件中的数据直接封装到第三方bean的属性当中
注1:宽松绑定下面四种写法只适用于@ConfigurationProperties注解当中(可以让实体类的属性名和yml配置文件中的配置名不一致,同样可以把yml文件中数据封装到实体类的属性当中),在@Value注解当中就不能使用宽松绑 定的那四种形式了(要保证yml配置文件中的配置名和实体类的或者属性的属性名保持一致,那么才能封装上yml配置文件中的数据)
注2:但是使用了上面的宽松绑定的四种yml配置文件中配置名的写法后,要想通过@ConfiggurationProperties(prefix="#")注解获取到用上面四种方式写的yml配置文件中的配置名数据的话,要遵守以下规则:
这里演示的是datasource的配置名, 如果上面的yml配置文件中的servers:.... 数据,servers配置名写成Servers形式,那么通过@ConfigurationProperties(prefix="servers")注解的形式获取yml配置文件中的Servers数据的时候,这个prefix里面就要纯小写形式servers才能获取到yml配置文件中的Servers配置名中的数据
代码演示如下:
也就是说,bean中的属性通过@ConfigurationProperties注解获取yml配置文件中的某些数据,在获取yml配置文件数据的时候,进行一下属性数据的校验,比如说bean中的time属性只想接收0-24之间的数字,因此我们就需要通过校验器进行一下校验判断yml配置文件中的time配置名中的数据是否在0-24之间,如果在的话再通过@ConfigurationProperties注解把yml配置文件中的数据封装到time属性中,如果不在就不封装
这两个坐标一个都不能少,第一个是:JSR303校验坐标,第二个是:校验器坐标,
注意:设置校验规则的时候,可以设定很多的规则,这里只展示了最大值,还可以有最小值等
代码演示如下所示:
当yml配置文件中的time数据不超过400的时候:
可以发现确实通过@ConfigurationProperties注解把yml配置文件中的数据封装到bean相对应的属性当中了
当yml配置文件中的数据超过校验规则400的最大400后,会发现再通过@ConfigurationProperties注解也获取不到yml配置文件中的数据也封装不到bean的属性当中了,因为设定规则了,除非yml中的数据在设置的规则内,那么才能把yml配置中的数据封装到我bean的属性中,要不然你就别想了: