[SpringBoot 2.x ] 开发实战day3,SpringBoot自定义配置(包括List、Map)

开发过程中,引入自定义配置是很常见的,主要记录两种:
1、@Value() 注解
2、@ConfigurationPropertie()注解

一、配置文件引入问题

springboot支持两种配置文件:*.properties 和 *.yml
首先先提一下,在springboot 1.5版本以后是通过@PropertySource(“path”)无法加载YAML文件,官方也给出说明

24.7.4 YAML Shortcomings
YAML files cannot be loaded by using the @PropertySource annotation. So, in the case that you need to load values that way, you need to use a properties file.

如果想引入yml文件,有两种方式:
① 将自定义配置放在application-*.yml中,
② 通过PropertySourcePlaceholderConfigurer来加载yml文件

上代码

// 加载YML格式自定义配置文件
	@Bean
	public static PropertySourcesPlaceholderConfigurer properties() {
		PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
		YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
		yaml.setResources(new FileSystemResource("config.yml"));//File引入
//		yaml.setResources(new ClassPathResource("youryml.yml"));//class引入
		configurer.setProperties(yaml.getObject());
		return configurer;
	}

二、自定义配置

本篇以*.properties为例

1、@Value() 注解

   引入配置文件

/**
 * 程序入口
 * @author guocheng.L
 */
@SpringBootApplication
// 加载配置文件
@PropertySource("classpath:config2.properties") 
public class MyspringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyspringbootApplication.class, args);
    }
}

config2.properties

user.name=tom
user.age=18
user.tel=13111111111
#集合表示 list
user.books=spring,java,C

#表示Map
user.map={name: 'lili', age: '19'}

Entity.java

/**
 *
 * @author gcheng.Ll
 * @create 2019-08-21 14:37
 */
@Component
public class SysUserConfig2 {

    @Value("${user.name}")
    private String name;
    @Value("${user.age}")
    private int age;
    @Value("${user.tel}")
    private String tel;

    /**
     * list 自定义配置
     */
    @Value("#{'${user.books}'.split(',')}")
    private List<String> books;

    /**
     * map 自定义配置
     */
    @Value("#{${user.map}}")
    private Map<String, String> wife;
    
    // 省略get,set,toString()方法
}

接口测试类

/**
 * @author gcheng.L
 * @create 2019-08-21 14:36
 */

@Controller
public class UserConfigController {

    @Autowired
    private SysUserConfig2 user2;
    @ResponseBody
    @RequestMapping("/configTest")
    public String test() {
        System.out.println(user2.toString());
        return "SUCCESS";
    }
}

结果:

SysUserConfig2{username='tom', age=18, tel='13111111111', books=[spring, java, C], wife={name=lili, age=19}}

代码解释:

  1. 利用@Value("${user.username}")注解来获取变量值,但要注意的是如果配置文件中没有设置相应的值,会报错,我们可以通过 @Value(参数名:默认值)的方式给相应的配置加上默认值,例如

    @Value("${user.age:10}")
    
  2. 利用@Value("#{’${user.books}’.split(’,’)}") 获取list值

  3. 利用@Value("#{${user.map}}") 获取map值,这里需要注意的是, 配置文件中map的写法,值一定要用单引号。

2、@ConfigurationPropertie()注解

引入配置文件

/**
 * 程序入口
 *
 * @author guocheng.L
 */
@SpringBootApplication
@PropertySource("classpath:config.properties")
public class MyspringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyspringbootApplication.class, args);
    }
}

config.properties

user.username=tom
user.age=18
user.tel=13111111111
#集合表示 list
user.books[0]=spring
user.books[1]=java
#表示Map
user.wife[name]=lili
user.wife[age]=19

Entity.java

@Component
@ConfigurationProperties(prefix = "user")
public class SysUserConfig {

    private String username;
    private int age;
    private String tel;

    /**
     * list 自定义配置
     */
    private List<String> books;

    /**
     * map 自定义配置
     */
    private Map<String, Object> wife;

    // 省略get,set,toString()方法
}

接口测试类

/**
 * @author gcheng.L
 * @create 2019-08-21 14:36
 */

@Controller
public class UserConfigController {

    @Autowired
    private SysUserConfig user;
    @ResponseBody
    @RequestMapping("/configTest")
    public String test() {
        System.out.println(user.toString());
        return "SUCCESS";
    }
}

结果:

SysUserConfig{username='tom', age=18, tel='13111111111', books=[spring, java], wife={name=lili, age=19}}

代码解读:

  1. 可以看出@ConfigurationProperties(prefix = “user”) 封装整个配置文件中user的配置属性,相对于@Value更加方便,即便是配置文件中没有定义相应的属性,在加载时也不会报错。
  2. 获取List和Map属性也相对简单一些。直接定义属性就可以
  3. 如果发现@ConfigurationPropertie不生效,有可能是项目的目录结构问题,你可以通过@EnableConfigurationProperties(ConnectionSettings.class)来明确指定需要用哪个实体类来装载配置信息。

三、随机数 random

在配置文件或者@Value()引入的时候可以添加springboot提供的随机数,当然springboot也提供了其他的常用参数,例如: os (用于获取系统信息), idea (用于获取开发工具信息), pom (用于获取 maven 配置信息), file 文件的相关处理等等。

配置如下

# 随机字符串
rd.value=${random.value}
# 随机int
rd.number=${random.int}
# 随机long
rd.bignumber=${random.long}
# 10以内随机数
rd.number1=${random.int(10)}
# 10 ~ 20 之间随机数
rd.number2=${random.int[10,20]}

Entiry.java

/**
 * @author gcheng.L
 * @create 2019-08-21 18:05
 */
@Component
@ConfigurationProperties(prefix = "rd")
public class SysRandom {
    // 随机字符串
    private String value;
    // 随机int
    private int number;
    // 随机long
    private long bignumber;
    // 10以内随机数
    private int number1;
    // 10 ~ 20 之间随机数
    private int number2;
}

结果:

SysRandom{value='870ae1b7873b6bfa2804efcc0ad7bfdd', number=1162495061, bignumber=-4241195572881172742, number1=4, number2=11}

这就是随机数的引用了, 也可以参数间的引用,像下面这种方式进行引用,通过 ${参数名} 的方式引用了上面提到的值,这里就不做测试了。

rd.age:${user.age}

源码地址:SpringBoot-Modules-Study/springboot-Day1

你可能感兴趣的:(springBoot)