当前位置: 代码网 > it编程>编程语言>Java > springboot使用@ConfigurationProperties实现自动绑定配置参数属性

springboot使用@ConfigurationProperties实现自动绑定配置参数属性

2025年05月05日 Java 我要评论
@configurationproperties使用@configurationproperties是 springboot提供用于将配置文件中的属性值映射到 java bean对象上。通过使用该注解

@configurationproperties使用

@configurationproperties是 springboot提供用于将配置文件中的属性值映射到 java bean对象上。通过使用该注解,我们可以方便地将属性文件中的值绑定到一个实例化的类对象上,从而方便地在应用程序中使用这些属性。

@configurationproperties注解有一个参数prefix用来指定属性公共前缀

@configuration
@configurationproperties(prefix = "myconfig")
@data
public class myconfigproperty {
    private int port;
    //找不到的属性不会注入
    private string hhh;
}

一般作为属性注入对象,首先定义成一个@configuration。然后使用@configurationproperties指定关联属性的前缀。

这样如果配置文件中有myconfig.port的值就会自动绑定到myconfigproperty类的port属性上。前提要有对应的set方法。

除了在类上标注外,还可以在@bean方法上

@configuration
public class myconfigbymethod {
    @bean
    @configurationproperties(prefix = "myconfig")
    public myconfig myconfig(){
        return  new myconfig();
    }
}

观察spring的源码,还会使用@enableconfigurationproperties引入被@configurationproperties修饰的bean

框架自动装配解析

在springboot框架自动装配中有一个内置的用来处理@configurationproperties注解的配置类configurationpropertiesautoconfiguration,该配置类引入@enableconfigurationproperties,然后间接引入enableconfigurationpropertiesregistrar,enableconfigurationpropertiesregistrar在configuration初始化的时候会调用其registerbeandefinitions()方法进行配置类中扩展beandef的加载。

enableconfigurationpropertiesregistrar#registerbeandefinitions

public void registerbeandefinitions(annotationmetadata metadata, beandefinitionregistry registry) {
		registerinfrastructurebeans(registry);
		registermethodvalidationexcludefilter(registry);
		configurationpropertiesbeanregistrar beanregistrar = new configurationpropertiesbeanregistrar(registry);
		gettypes(metadata).foreach(beanregistrar::register);
	}

private set<class<?>> gettypes(annotationmetadata metadata) {
   return metadata.getannotations().stream(enableconfigurationproperties.class)
         .flatmap((annotation) -> arrays.stream(annotation.getclassarray(mergedannotation.value)))
         .filter((type) -> void.class != type).collect(collectors.toset());
}
static void registerinfrastructurebeans(beandefinitionregistry registry) {
		configurationpropertiesbindingpostprocessor.register(registry);
		boundconfigurationproperties.register(registry);
}

这里主要会完成两件事件:

1、registerinfrastructurebeans会将configurationpropertiesbindingpostprocessor注册到容器中,这是一个后置处理其,属性的赋值会在其后置方法里完成。

2、注册合适的configurationproperties类型bean, 当前metadata是正在初始化的configuration类,然后从其注解上获取带有enableconfigurationproperties注解作为bean定义加载到容器中。

来看几个自动装配的例子:

servletwebserverfactoryautoconfiguration

  • servletwebserverfactoryautoconfiguration上带有@enableconfigurationproperties(serverproperties.class)注解,则serverproperties会作为一个bean进行处理。
  • serverproperties上配置有@configurationproperties(prefix = “server”, ignoreunknownfields = true),我们场景的server.port属性就会注入到serverproperties.port属性上。

datasourceautoconfiguration

@enableconfigurationproperties(datasourceproperties.class)
public class datasourceautoconfiguration {}

@configurationproperties(prefix = "spring.datasource")
public class datasourceproperties{}

datasourceproperties会被做为一个bean加载,"spring.datasource"下的属性会注入到datasourceproperties属性中。

configurationpropertiesbindingpostprocessor

configurationpropertiesbindingpostprocessor是一个bean后置处理器,在bean实例化后会调用其后置方法

public object postprocessbeforeinitialization(object bean, string beanname) throws beansexception {
   bind(configurationpropertiesbean.get(this.applicationcontext, bean, beanname));
   return bean;
}

configurationpropertiesbean.get()方法会判断当前bean是否有configurationproperties注解,如果有会进行对应的属性绑定。

最后使用org.springframework.boot.context.properties.bind.binder类进行属性绑定。

这里configurationproperties会有两部分,一是框架通过autoconfig自动装配的,一种是我们自己显示使用@configurationproperties修饰的bean。

这里看到我们在自定义@configurationproperties时候不一定非用@configuration进行修饰,只要当前类能被解析成一个bean,都会调用该后置方法进行对应配置属性的赋值。

属性元数据信息

可配置的属性在每个jar包meta-info/spring-configuration-metadata.json文件。这样一般在idea配置application文件时候都能根据该文件里的元数据信息进行提示配置。

例如server.port配置在spring-boot-autoconfigure.jar包中

{
  "name": "server.port",
  "type": "java.lang.integer",
  "description": "server http port.",
  "sourcetype": "org.springframework.boot.autoconfigure.web.serverproperties",
  "defaultvalue": 8080
},

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com