设为首页 加入收藏

TOP

quarkus实战之七:使用配置(四)
2023-08-06 07:50:00 】 浏览:114
Tags:quarkus
ult注解设置默认值,如果配置项"student.favorite"不存在,则默认值生效 * @return */ @WithDefault("default from code") String favorite(); }
  • 从上述代码可见,一个接口即可完成所有配置项的注入,在使用这些配置项的时候,只要注入StudentConfiguration实例即可
  • 首先要用ConfigMapping指明配置项的前缀,该接口中的方法都对应具有此前缀的配置项
  • 一般情况下,方法名就等于配置项的名称,也可以用WithName指定配置项名称
  • WithDefault指定默认值,如果找不到配置项就用此默认值
  • 来看看如何使用这个配置接口,web服务代码如下,只要依赖注入StudentConfiguration即可,不在需要为每个配置项都用成员变量和ConfigProperty注解了
package com.bolingcavalry;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;

@Path("/actions")
public class HobbyResource {

    @Inject
    StudentConfiguration student;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {

        return "Hello RESTEasy, "
                + LocalDateTime.now()
                + " [" + student.name() + "], "
                + " [" + student.age() + "], "
                + " [" + student.desc() + "], "
                + " [" + student.favorite() + "]";
    }
}
  • 运行代码,用浏览器访问web接口试试,如下图,所有配置项都能正确获取

image-20220310082423348

配置项是多个单词时,如何对应配置接口的方法?

  • 回顾刚才的配置,name、age、description这些都是单个单词,现在如果有个配置项是多个单词,例如学号的英文是student number,应该如何转为StudentConfiguration接口的方法呢?
  • 首先要看您的匹配项的命名风格,对多个单词是如何分隔的,一般有这三种:
  1. 减号分隔:student-number
  2. 下划线分隔:student_number
  3. 驼峰命名:studentNumber
  • ConfigMapping注解提供了namingStrategy的属性,其值有三种,分别对应上述三种命名风格,您根据自身情况选用即可
  1. KEBAB_CASE(默认值):减号分隔的配置项转为驼峰命令的方法,配置项student-number对应的方法是studentNumber
  2. SNAKE_CASE:下划线分隔的配置项转为驼峰命令的方法,配置项student_number对应的方法是studentNumber
  3. VERBATIM:完全对应,不做任何转换,配置项student_number对应的方法是student_number
  • 使用namingStrategy属性的示例代码如下
@ConfigMapping(prefix = "student", namingStrategy = ConfigMapping.NamingStrategy.SNAKE_CASE)
public interface StudentConfiguration {
    /**
     * 名字与配置项一致
     * @return
     */
    String name();
    ...

配置接口嵌套

  • 再来看下面的配置,有两个配置项的前缀都是student.address,给人的感觉像是student对象里面有个成员变量是address类型的,而address有两个字段:province和city
student.name=Tom
student.age=11
student.description=He is a good boy

student.address.province=guangdong
student.address.city=shenzhen
  • 针对上述配置,quarkus支持用接口嵌套来导入,具体做法分为两步,首先新增一个接口Address.java,源码如下
package com.bolingcavalry;

public interface Address {
    String province();
    String city();
}
  • 第二步,在配置接口StudentConfiguration.java中,增加下图红框中的一行代码(接口中返回接口,形成接口嵌套)

image-20220310083629464

  • 最后,修改HobbyResource.java代码,增加下图红框中的两行,验证能否正常取得address前缀的配置项目

image-20220310083947856

  • 重启应用,如下图,配置项可以正常获取

image-20220310084223359

配置项转为map

  • 前面的接口嵌套,虽然将多层级的配置以对象的形式清晰的表达出来,但也引出一个问题:配置越多,接口定义或者接口方法就越多,代码随之增加
  • 如果配置项的层级简单,还有种简单的方式将其映射到配置接口中:转为map
  • 依然以下面的配置项为例
student.address.province=guangdong
student.address.city=shenzhen
  • 对应的代码改动如下图,只要把address方法的返回值从Address改为Map<String, String>即可,这样修改后,address层级下面再增加配置项,也不用修改配置项有关的代码了:

image-20220311080316711

  • 使用配置的业务代码也要改,如下图,改为从map中获取

image-20220311080529522

  • 部署运行验证,可以正常取值

image-20220311081214976

内置配置项

  • quarkus有很多内置的配置项,例如web服务的端口quarkus.http.port就是其中一个,如果您熟悉SpringBoot的话,对这些内置配置项应该很好理解,数据库、消息、缓存,都有对应配置项

  • 篇幅所限就不在此讲解quarkus内置的配置项了,您可以参考这份官方提供的配置项列表,里面有详细说明:https://quarkus.io/guides/all-config

  • 上述文档中,有很多配置项带有加锁的图标,如下图红框所示,有这个图标的配置项,其值在应用构建的时候已经固定了,在应用运行期间始终保持只读状态
    在这里插入图片描述

  • 这种带有加锁图标的配置项的值,在应用运行期间真的不能改变了吗?其实还是有办法的,官方文档指明,如果业务的情况特殊,一定要变,就走热部署的途径,您可以参考《quarkus实战之四:远程热部署》

  • 官方对开发者的建议:在开发

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JDBC p3 事务 下一篇3、Spring之入门案例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目