SpringBoot高级配置实例分析

蜗牛 互联网技术资讯 2022-08-19 135 0

本文小编为大家详细介绍“SpringBoot高级配置实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot高级配置实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    @ConfigurationProperties注入

    创建一个新的模板

    注意的是加入所需的支持这什么也不勾选。

    ServerConfig.java

    package com.jkj.config;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    @ConfigurationProperties(prefix = "servers")
    @Component
    @Data
    public class ServerConfig {
        private String ipAddress;
        private int port;
        private long timeout;
    }

    注意:

    @Data

    为当前实体类在编译期设置对应的get/set,toString方法,hashCode方法,equals方法等。

    需要导入lomok的依赖:

    <dependency>
    			<groupId>org.projectlombok</groupId>
    			<artifactId>lombok</artifactId>
    		</dependency>

    编写application.yml

    servers:
      ipAddress: 168.225.0.15
      port: 1234
      timeout: -1

    编写ConfigurationApplication.java

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

    运行结果:ServerConfig(ipAddress=168.225.0.15, port=123456, timeout=-1)

    给第三方Bean绑定属性

    方式一

    编写ConfigurationApplication.java

    @SpringBootApplication
    public class ConfigurationApplication {
        @Bean
    	public DruidDataSource dataSource(){
    		DruidDataSource ds = new DruidDataSource();
    		ds.setDriverClassName("com.mysql.jdbc.Driver");
    		return ds;
    	}
    	public static void main(String[] args) {
    		ConfigurableApplicationContext cac = SpringApplication.run(ConfigurationApplication.class, args);
    		ServerConfig bean = cac.getBean(ServerConfig.class);
    		System.out.println(bean); 
    		DruidDataSource ds = cac.getBean(DruidDataSource.class);
    		System.out.println(ds);
    	}
    }

    运行结果:com.mysql.jdbc.Driver

    方式二

    使用@ConfigurationProperties为第三方bean绑定属性

    编写application.yml

    servers:
      ipAddress: 168.225.0.15
      port: 1234
      timeout: -1
    dataSource:
      driverClassName: com.mysql.jdbc.Driver

    编写ConfigurationApplication.java

    @SpringBootApplication
    public class ConfigurationApplication {
        @Bean
        @ConfigurationProperties(prefix = "datasource")
    	public DruidDataSource dataSource(){
    		DruidDataSource ds = new DruidDataSource();
    		return ds;
    	}
    	public static void main(String[] args) {
    		ConfigurableApplicationContext cac = SpringApplication.run(ConfigurationApplication.class, args);
    		ServerConfig bean = cac.getBean(ServerConfig.class);
    		System.out.println(bean); 
    		DruidDataSource ds = cac.getBean(DruidDataSource.class);
    		System.out.println(ds.getDriverClassName()); 
    	}
    }

    运行结果:com.mysql.jdbc.Driver

    @EnableconfigurationProperties

    @EnableConfigurationProperties注解可以将使用@ConfigurationProperties注解对应的类加入Spring容器

    ConfigurationApplication.java

    @SpringBootApplication
    @EnableConfigurationProperties(ServerConfig.class)
    public class ConfigurationApplication {
        @Bean
        @ConfigurationProperties(prefix = "datasource")
    	public DruidDataSource dataSource(){
    		DruidDataSource ds = new DruidDataSource();
    		return ds;
    	}
    	public static void main(String[] args) {
    		ConfigurableApplicationContext cac = SpringApplication.run(ConfigurationApplication.class, args);
    		ServerConfig bean = cac.getBean(ServerConfig.class);
    		System.out.println(bean); 
    		DruidDataSource ds = cac.getBean(DruidDataSource.class);
    		System.out.println(ds.getDriverClassName()); 
    	}
    }

    ServerConfig.java

    package com.jkj.config;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    @ConfigurationProperties(prefix = "servers")
    @Data
    public class ServerConfig {
        private String ipAddress;
        private int port;
        private long timeout;
    }

    注意:@EnableConfigurationProperties@Component不能同时使用

    解除使用@ConfigurationProperties注释警告

    SpringBoot高级配置实例分析  springboot 第1张

    加入依赖:

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

    宽松绑定

    • 宽松绑定就是configrationProperties注入的书写规范并不严格,大小写,下划线、中划线、springboot都可以忽略。

    • @ConfigurationProperties绑定属性支持属性名宽松绑定。

    以ipAddress为例:

    驼峰模式

     ipAddress: 168.225.0.15

    下划线模式

    ip_address: 168.225.0.15

    中划线模式

    IP_ADD_R-E-SS: 168.225.0.15

    常量模式

    IP_ADDRESS: 168.225.0.15

    大写模式

     IPADDRESS: 168.225.0.15

    烤肉串模式(推荐使用)

      ip-address: 168.225.0.15

    宽松绑定不支持注解@Value引用单个属性的方式

    测试:

    package com.jkj;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.test.context.SpringBootTest;
    @SpringBootTest
    class Springboot06ConfigurationApplicationTests {
        @Value("${servers.ipAddress}")
    	private String msg;
    	@Test
    	void contextLoads() {
    		System.out.println(msg); 
    	}
    }

    报错信息:Could not resolve placeholder 'servers.ipAddress' in value "${servers.ipAddress}"

    常量计量单位绑定

    SpringBoot支持JDK8提供的时间与空间计量单位

    package com.jkj.config;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.convert.DataSizeUnit;
    import org.springframework.boot.convert.DurationUnit;
    import org.springframework.util.unit.DataSize;
    import org.springframework.util.unit.DataUnit;
    import java.time.Duration;
    import java.time.temporal.ChronoUnit;
    @ConfigurationProperties(prefix = "servers")
    @Data
    public class ServerConfig {
        private String ipAddress;
        private int port;
        private long timeout;
        @DurationUnit(ChronoUnit.DAYS)
        private Duration serverTimeOut;
        @DataSizeUnit(DataUnit.TERABYTES)
        private DataSize dataSize;
    }

    常用计量单位 ChronoUnit

    SpringBoot高级配置实例分析  springboot 第2张

    DataUnit

    SpringBoot高级配置实例分析  springboot 第3张

    数据校验

    添加了SR303规范坐标与Hibernate校验框架对应坐标

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

    使用hibernate框架提供的校验器做实现类

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

    对Bean开启校验功能

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

    设置校验规则

    @ConfigurationProperties(prefix = "servers")
    @Validated
    @Data
    public class ServerConfig {
        private String ipAddress;
        @Max(value = 9999,message = "最大值不能超过9999")
        @Min(value = 1111,message = "最小值不能超过1111")
        private int port;
        private long timeout;
    }

    yml文件中port设置为1234,测试结果如下

    SpringBoot高级配置实例分析  springboot 第4张

    进制数据转换规则

    案例模拟

    编写application.yml

    servers:
      ipAddress: 168.225.0.15
      port: 1234
      timeout: -1
    dataSource:
      driverClassName: com.mysql.jdbc.Driver
      password: 0123

    编写ConfigureApplication,java

    package com.jkj;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.test.context.SpringBootTest;
    @SpringBootTest
    class Springboot06ConfigurationApplicationTests {
        @Value("${dataSource.Password}")
    	private Password psw;
    	@Test
    	void contextLoads() {
    		System.out.println(psw); 
    	}
    }

    测试结果是个八进制的83。

    注意:根据字面值表达方式,String类型的需要使用双引号包裹。

    重新编写application.yml

    servers:
      ipAddress: 168.225.0.15
      port: 1234
      timeout: -1
    dataSource:
      driverClassName: com.mysql.jdbc.Driver
      password: "0123"

    运行结果:

    SpringBoot高级配置实例分析  springboot 第5张

    读到这里,这篇“SpringBoot高级配置实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注蜗牛博客行业资讯频道。

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram