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

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

目录

自定义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文件中加入一个依赖坐标


  org.springframework.boot
  spring-boot-configuration-processor

然后,我们要为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了

自定义bean加载成功

第三方bean的绑定

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


    com.alibaba
    druid
    1.1.6

我们通过这样的方式拿到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());
    }

}

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

 接下来我们通过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;
}

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

@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

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

bean属性校验 

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

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


    javax.validation
    validation-api

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


    org.hibernate.validator
    hibernate-validator

然后在需要校验的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

控制台就显示报错了 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/738932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存