springboot可选参数_SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定

常见配置绑定方式

1cb774ddda8a1bd3856737acd6aff05b.png

SpringBoot在不断地版本迭代中陆续提供了不同的配置参数绑定的方式,我们可以单独获取一个配置参数也可以将一系列的配置映射绑定到JavaBean的属性字段,下面我们来看看这几种方式的配置绑定哪一种是你最常用到的。

示例配置参数1

2

3

4system:

config:

app-id: hengboy

app-secret: yuqiyu@admin

上面是一段示例的配置参数,提供给下面的配置绑定方式来使用。

@Configuration方式绑定

当我们需要将一个配置前缀下的参数映射绑定到JavaBean的属性字段时,我们可以考虑使用@ConfigurationProperties + @Configuration注解组合的方式,使用如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17/**

* 系统配置

*

* @author 恒宇少年

*/

@Configuration

@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)

@Data

public class SystemConfig{

/**

* 系统配置前缀

*/

public static final String SYSTEM_CONFIG_PREFIX = "system.config";

private String appId;

private String appSecret;

}

注意事项:配置参数与JavaBean属性之间的绑定是通过调用JavaBean属性的Setter方法来赋值的,所以我们需要提供对应属性字段的Setter方法。

由于@Configuration注解被@Component修饰,所以我们在使用时只需要注入SystemConfig配置绑定映射类即可,通过Getter方法来获取对应配置参数的值。

配置扫描路径方式绑定

如果你系统中需要创建的配置映射类较多,而且每一个类都需要交付给IOC容器进行托管,那么可以考虑使用@ConfigurationPropertiesScan + @ConfigurationProperties注解组合的方式,使用如下所示:

1

2

3

4

5

6

7

8@SpringBootApplication

@ConfigurationPropertiesScan

public class ConfigureBindingAwayApplication{

public static void main(String[] args){

SpringApplication.run(ConfigureBindingAwayApplication.class, args);

}

}

我们首先需要在XxxApplication应用程序启动类上添加@ConfigurationPropertiesScan注解,表示我们需要使用自动扫描的方式来注册配置映射类,注解配置参数如下所示:

value:配置扫描的基础package,与basePackages作用一致,通过数组的形式来接收配置。

basePackages:配置扫描的基础package。

basePackageClasses:配置基础扫描类,会将每一个扫描类所处于的package作为扫描基础package。

当我们在使用@ConfigurationPropertiesScan注解时,如果不进行自定义扫描路径,默认使用SpringBoot应用程序扫描的packages。

使用这种方式我们配置映射类就不再需要添加@Configuration注解了,这是因为我们在使用@ConfigurationPropertiesScan注解时,会通过@Import方式来引用配置映射类的注册实现,详见:org.springframework.boot.context.properties.ConfigurationPropertiesScanRegistrar#registerBeanDefinitions,配置映射类如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16/**

* 系统配置

*

* @author 恒宇少年

*/

@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)

@Data

public class SystemConfig{

/**

* 系统配置前缀

*/

public static final String SYSTEM_CONFIG_PREFIX = "system.config";

private String appId;

private String appSecret;

}

构造函数方式绑定

在上面的两种方式都是通过Setter方法来进行映射字段的赋值,而构造函数绑定方式是通过构造函数来进行赋值的,我们只需要在配置映射类上添加@ConstructorBinding注解并提供对应的构造函数即可,使用方式如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22/**

* 系统配置

*

* @author 恒宇少年

*/

@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)

@ConstructorBinding

@Getter

public class SystemConfig{

/**

* 系统配置前缀

*/

public static final String SYSTEM_CONFIG_PREFIX = "system.config";

public SystemConfig(String appId, String appSecret){

this.appId = appId;

this.appSecret = appSecret;

}

private String appId;

private String appSecret;

}

在之前我也写过一篇关于构造函数映射配置参数的问题,详情访问:@ConstructorBinding注解的使用

第三方类绑定

如果我们需要将配置参数映射绑定到第三方依赖内提供的JavaBean,我们该使用什么方式呢?由于接收参数的类并不是我们自己编写的,所以没有办法对.class文件源码进行修改。

这时我们可以将第三方提供的JavaBean交给IOC容器托管,然后结合@ConfigurationProperties注解来映射绑定配置参数,使用方式如下所示:

1

2

3

4

5@Bean

@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)

public SystemConfig systemConfig(){

return new SystemConfig();

}

这种方式也需要第三方提供的JavaBean有映射字段的Setter方法,否则无法进行赋值。

我们知道通过@Bean注解修饰的方法,会将方法的返回值加入到IOC容器内,那我们在使用配置时,直接注入配置映射类就可以了。

总结

上面这几种配置绑定方式都遵循OOP实现,当然如果你只需要获取一个配置参数,使用@Value也是一个好的选择,没有更好,只有更合适,根据每一种绑定方式的特点合理的选择一个合适业务的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值