美文网首页
Spring Boot 自定义配置详解(二)

Spring Boot 自定义配置详解(二)

作者: wuyuxiao | 来源:发表于2018-03-15 17:03 被阅读0次

1.自定义复杂嵌套配置信息类

  上一节中,我给大家介绍了简单类如何自定义配置信息,但是实际应用场景中可能你并不希望把所有的配置信息都放在一个类中,使得一个类太臃肿,我们希望分离这些配置信息,所以类中常常会嵌套其他类,例如

@ConfigurationProperties(prefix = "wyx.security")
public class SecurityProperties {

    private BrowserProperties browser = new BrowserProperties();
    private ImageCodeProperties imgCode = new ImageCodeProperties();
    //省略get,set方法
}
public class BrowserProperties {

    private String loginPage ;
    private LoginType loginType;
    //省略get,set方法
}
public class ImageCodeProperties {
    private int width=67;
    private int height=23;
    private int length=4;
    private int expireIn=60;
    private String urls;
    //省略get,set方法
}

  这么做是没问题的,spring依然会为我们装配这些配置信息,配置如下
application.yml

wyx:
  security:
    browser:
      login-page: /demo-signIn.html
      login-type: redirect
    img-code:
      length: 20
      urls: /user,/user/*

  这时候我们发现IDEA又无法正确提示配置信息了,通过上一节我们了解到,IDEA主要是依靠spring-configuration-metadata.json文件去提示配置信息,也就是说我们现在生成的json文件不正确,我们来看看
spring-configuration-metadata.json

{
  "hints": [],
  "groups": [
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security",
      "type": "wyx.practice.spring.security.core.properties.SecurityProperties"
    }
  ],
  "properties": [
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security.browser",
      "type": "wyx.practice.spring.security.core.properties.BrowserProperties"
    },
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security.img-code",
      "type": "wyx.practice.spring.security.core.properties.ImageCodeProperties"
    }
  ]
}

我们可以看到properties中已经丢失了嵌套类的内部属性,当然就无法正确提示配置信息。

1.1 内部类方式生成正确元信息

@ConfigurationProperties(prefix = "wyx.security")
public class SecurityProperties {

    private BrowserProperties browser = new BrowserProperties();
    private ImageCodeProperties imgCode = new ImageCodeProperties();

    public class BrowserProperties {
        private String loginPage ;
        private LoginType loginType;
    }
    public class ImageCodeProperties {
        private int width=67;
        private int height=23;
        private int length=4;
        private int expireIn=60;
        private String urls;
    }
    //省略get,set方法
}

这么一改我们重新build一次

{
  "hints": [],
  "groups": [
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security",
      "type": "wyx.practice.spring.security.core.properties.SecurityProperties"
    },
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security.browser",
      "sourceMethod": "getBrowser()",
      "type": "wyx.practice.spring.security.core.properties.BrowserProperties"
    },
    {
      "sourceType": "wyx.practice.spring.security.core.properties.SecurityProperties",
      "name": "wyx.security.img-code",
      "sourceMethod": "getImgCode()",
      "type": "wyx.practice.spring.security.core.properties.ImageCodeProperties"
    }
  ],
  "properties": [
    {
      "sourceType": "wyx.practice.spring.security.core.properties.BrowserProperties",
      "name": "wyx.security.browser.login-page",
      "type": "java.lang.String"
    },
    {
      "sourceType": "wyx.practice.spring.security.core.properties.BrowserProperties",
      "name": "wyx.security.browser.login-type",
      "type": "wyx.practice.spring.security.core.properties.LoginType"
    },
    {
      "sourceType": "wyx.practice.spring.security.core.properties.ImageCodeProperties",
      "name": "wyx.security.img-code.expire-in",
      "type": "java.lang.Integer"
    },
   ...
  ]
}

  果然内部属性可以生成,在编辑时我们的IDEA也可以提示配置信息了。
  虽然这么做可以解决一部分的情况,实际开发中我们一些较老的项目已经有配置类,如果我们把配置类抽出来重写成内部类显然是非常麻烦的一种做法,有没有一种方式可以直接将外部类引入之后就可以生成正确元信息的方法?
  当然是有啊!没有我说个JB!

1.2注解方式生成嵌套类元信息

方法非常简单,我们只需要在自定义配置类中加入

注:此时类BrowserProperties ImageCodeProperties已经被迁移到外部

@ConfigurationProperties(prefix = "wyx.security")
public class SecurityProperties {
    @NestedConfigurationProperty
    private BrowserProperties browser = new BrowserProperties();
    @NestedConfigurationProperty
    private ImageCodeProperties imgCode = new ImageCodeProperties();

}

@NestedConfigurationProperty就是帮助spring-boot-configuration-processor库来识别并正确生成外部类内部属性的注解。生成的元信息文件我就不贴了。

注:spring-boot-configuration-processorlombook存在兼容性问题,猜测是因为有时lombook生成类get/set方法在spring-boot-configuration-processor之后,导致spring-boot-configuration-processor没有获取到内部属性,在配置类请尽量不要使用lombok注解生成get/set方法.

待续...
准备写下list或者map配置信息的获取

相关文章

网友评论

      本文标题:Spring Boot 自定义配置详解(二)

      本文链接:https://www.haomeiwen.com/subject/biuhqftx.html