SpringBoot 学习笔记4 配置高级-第三方属性bean配置绑定

目录

自定义bean的绑定

第三方bean的绑定

@EnableConfigurationProperties:

松散绑定

bean属性校验 

我们先新建一个SpringBoot项目

自定义bean的绑定

@Component
@Data
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

先来随便定义一个类,随便写三个成员变量,加上@Data注解替我们生成get set等方法(当然,要提前导入lombok的坐标),然后,再加上一个@Component注解,让这个类被定义为一个受Spring管控的bean。这样,自定义的bean就完成了

然后,我们就来到配置文件中为这个bean配置上值。为了避免与SpringBoot中的端口配置相冲突,这里改成servers,我们随机为这个自定义的bean配置一些值

servers:
  ipAddress: 192.168.0.1
  port: 88
  timeout: 123

那我们如何将这些配置的值和bean绑定起来呢?

首先,在pom文件中加入一个依赖坐标

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

然后,我们要为bean加一个@ConfigurationProperties的注解,并将perfix的值赋值为配置值的上一级,也就是”servers“

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

 接下来,在控制台上输出这个bean,看一下有没有为其配置上值,要打印这个bean,我们要先对Application类做一个修改

@SpringBootApplication
public class Springboot08ConfigurationApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot08ConfigurationApplication.class, args);
        ServerConfig bean = ctx.getBean(ServerConfig.class);
        System.out.println(bean);
    }

}

这样就可以输出查看bean了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

自定义bean加载成功

第三方bean的绑定

 首先要导入一个第三方bean的依赖坐标,这里选择德鲁伊,这里选择德鲁伊只是用来做示例,而且德鲁伊是可以往bean中set一些值的,实际应用时还有更多的第三方bean可供使用

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.6</version>
</dependency>

我们通过这样的方式拿到bean

@SpringBootApplication
public class Springboot08ConfigurationApplication {

    @Bean
    public DruidDataSource druidDataSource(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot08ConfigurationApplication.class, args);
        ServerConfig bean = ctx.getBean(ServerConfig.class);
        System.out.println(bean);
        DruidDataSource ds = ctx.getBean(DruidDataSource.class);
        System.out.println(ds.getDriverClassName());
    }

}

在控制台上输出了一些字符串。这些字符串显示的是一些数据源连接池的一些初始化的配置值。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

 接下来我们通过yml配置文件,为这个bean注入一些值

servers:
  ipAddress: 192.168.0.1
  port: 88
  timeout: 123

datasource:
  driverClassName: com.mysql.jdbc.Driver

跟自定义的bean一样,我们还要再添加一个注解

@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource druidDataSource(){
   DruidDataSource ds = new DruidDataSource();
   return ds;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

运行后成功拿到了我们配置的值 

@EnableConfigurationProperties:

@EnableConfigurationProperties(xxx.class)这个注解的后面是必须要跟一个类名的,它的作用是开启属性绑定,并设置相应的对象是谁。后面的类名是数组的形式,{xxx1.class,xxx2.class,xxx3.class……},只有一个类名时,大括号可以省略。因为@EnableConfigurationProperties(xxx.class)有设置相应对象是谁的功能,所以在后面的类上就不可以加@Component的注解,这样会导致出现两个相同的bean,spring就会报错。

松散绑定

springboot为了兼容多种开发者的不同命名习惯,在绑定时可以兼容不同的命名规范,以下命名也是可以被识别并绑定成功的。

servers:
  ip_address: 192.168.0.1
  PORT: 88
  time-out: 123

datasource:
  dr_i_vErClassName: com.mysql.jdbc.Driver

那么springboot是如何做到这一点的呢。

SpringBoot在读取配置时会忽略掉标识符中的所有下划线" _ "和中划线" - ",并将所有的字母转为大写,并将bean中的标识符也转为大写字母,再把他们匹配起来,达到兼容多种命名规范的目的。

SpringBoot中推荐的命名方式是使用“烤肉串”的方式进行命名,也就是使用“ - ”,我们可以将上面的配置文件全部改为烤肉串的命名方式。

servers:
  ip-address: 192.168.0.1
  port: 88
  time-out: 123

data-source:
  driver-class-name: com.mysql.jdbc.Driver

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

当然,在程序中也要对应使用烤肉串的命名方式,当然,不使用也可,因为springboot在读取时会忽略 - ,但是在程序中这里是不允许出现大写的,这样的话就会报错。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

bean属性校验 

为了避免在配置属性值时出错,我们可以加入bean属性的校验。开启数据校验有助于提高系统的安全性。J2EE规范中JSR303规范定义了一组有关数据校验相关的API

我们首先把这套规范的API依赖坐标导入到项目中

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

这时候接口我们有了,但没有实现类,所有我们还要导入一个坐标,作为实现类。这是hibernate框架提供的校验器做实现类

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

然后在需要校验的bean上加@Validated注解,然后就可以开始编写规则

@Component
@Data
@ConfigurationProperties(prefix = "servers")
@Validated
//开启对当前bean的属性注入的校验
public class ServerConfig {
    private String ipAddress;
    @Max(value = 888,message = "最大值不能超过888")
    @Min(value = 100,message = "最小值不能超过100")
    private int port;
    private long timeout;
}

 我们现在让port的值为999

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARy5FLk4u,size_20,color_FFFFFF,t_70,g_se,x_16

控制台就显示报错了 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.E.N.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值