我们知道在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应该如何实现这个呢?
接下来我会用我这边实际项目中遇到的例子说明下:
(1)使用注解@Value映射
可以使用@Value注解进行映射,这种方法适用于对象的参数比较少的情况,我们可以直接在对象的属性上使用@Value注解,在其中以${}的形式传入配置文件中对应的属性,${}内的输入内容可以使用jsonPath的取值方式表达;
yml配置文件的写法如下:
shopify:
email: test@qq.com<br> name:test
address:
address1: 123Amoebobacterieae St
city: Ottawa
country: Canada
country_code: CA
first_name: Bob
last_name: Bobsen
name: Bob Bobsen
phone: 555-625-1199
province: Ontario
province_code: ON
zip: K2P0V6
这个时候想要取到上述配置文件中的email的取值,可以通过使用注解@Value映射,如下:
@Getter
@Setter
@Component
public class OrderBean {
@Value("${shopify.email}")
private String email;
}
${shopify.email}就是使用的上述jsonPath的写法;这样就可以取到配置文件中的email字段的值。当然要取多少个字段的值,就要写对应数量的@Value,如下:
@Getter
@Setter
@Component
public class OrderBean {
@Value("${shopify.email}")
private String email;
@Value("${shopify.name}")
private String name;
}
(2)使用@ConfigurationProperties映射
第二种方法相对于第一种方法更简单一些,不需要在每一个字段的上面的使用@Value注解,直接使用一个@ConfigurationProperties注解标注在类上即可,在其中传入的参数为在yml配置文件上参数的前缀,但是效果是和第一种是一样的;
实际例子如下:
yml配置文件:
shopify:
email: test@qq.com
name:test
address:
address1: 123Amoebobacterieae St
city: Ottawa
country: Canada
country_code: CA
first_name: Bob
last_name: Bobsen
name: Bob Bobsen
phone: 555-625-1199
province: Ontario
province_code: ON
zip: K2P0V6
这个时候想要获取各个字段对应的配置的值,首先要保证Bean类中的变量名和配置文件中的变量名一模一样(区分大小写),且类需要提供字段的setter方法(这里的实现可以用lombok的注释@Getter和@Setter注解实现)
@Component
@ConfigurationProperties(prefix = "shopify.address")
@Getter
@Setter
public class Shipping_addressBean {
private String address1;
private String city;
private String country;
private String country_code;
private String first_name;
private String last_name;
private String name;
private String phone;
private String province;
private String province_code;
private String zip;
}
@ConfigurationProperties注解声明当前类为配置读取类
prefix="shopify.address"表示读取前缀为shopify.address的属性
会将配置文件中前缀为prefix的属性赋给类中同名的字段
最后在测试类中实例化 Shipping_addressBean,将address对象传入对应的方法中就可以实现addressBean使用配置文件中的值
@Autowired
Shipping_addressBean address;