這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
mvn "io.quarkus:quarkus-maven-plugin:create" \
-DprojectGroupId="com.bolingcavalry" \
-DprojectArtifactId="hello-quarkus" \
-DprojectVersion="1.0-SNAPSHOT" \
-DclassName="HobbyResource" \
-Dpath="actions"
greeting.message = hello from application.properties
@ConfigProperty(name = "greeting.message")
String message;
@Path("/actions")
public class HobbyResource {
// 組態檔中不存在名為not.exists.config的設定項
@ConfigProperty(name = "not.exists.config")
String notExistsConfig;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy, " + LocalDateTime.now() + ", [" + notExistsConfig + "]";
}
}
@Path("/actions")
public class HobbyResource {
// 組態檔中不存在名為not.exists.config的設定項
@ConfigProperty(name = "not.exists.config", defaultValue = "112233")
String notExistsConfig;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy, " + LocalDateTime.now() + ", [" + notExistsConfig + "]";
}
}
// 組態檔中不存在名為not.exists.config的設定項
@ConfigProperty(name = "not.exists.config", defaultValue = "123")
int notExistsConfig;
@ConfigProperty(name = "server.address", defaultValue = "192.168.1.1")
InetAddress serverAddress;
@Path("/actions")
public class HobbyResource {
// 組態檔中存在名為greeting.message的設定項
@ConfigProperty(name = "greeting.message")
String message;
// 組態檔中,不論是否存在名為optional.message的設定項,應用都不會丟擲異常
@ConfigProperty(name = "optional.message")
Optional<String> optionalMessage;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
List<String> list = new ArrayList<>();
list.add(message);
// 只有設定項optional.message存在的時候,才會執行list.add方法
optionalMessage.ifPresent(list::add);
return "Hello RESTEasy, " + LocalDateTime.now() + ", " + list;
}
}
@Path("/actions")
public class HobbyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
List<String> list = new ArrayList<>();
// 可以用靜態方法取得Config範例
Config config = ConfigProvider.getConfig();
// getValue可取得指定設定項的指定型別值
String greet = config.getValue("greeting.message", String.class);
list.add(greet);
// getOptionalValue可以將設定項的值包狀為Optional物件,如果設定項不存在,也不會報錯
Optional<String> optional = config.getOptionalValue("not.exists.config", String.class);
// 函數語言程式設計:只用optional中有物件時,才會執行list.add方法
optional.ifPresent(list::add);
return "Hello RESTEasy, " + LocalDateTime.now() + ", " + list;
}
}
student.name=Tom
student.age=11
student.description=He is a good boy
package com.bolingcavalry;
import io.smallrye.config.ConfigMapping;
import io.smallrye.config.WithDefault;
import io.smallrye.config.WithName;
@ConfigMapping(prefix = "student")
public interface StudentConfiguration {
/**
* 名字與設定項一致
* @return
*/
String name();
/**
* 名字與設定項一致,自動轉為int型
* @return
*/
int age();
/**
* 名字與設定項不一致時,用WithName註解指定設定項
* @return
*/
@WithName("description")
String desc();
/**
* 用WithDefault註解設定預設值,如果設定項"student.favorite"不存在,則預設值生效
* @return
*/
@WithDefault("default from code")
String favorite();
}
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() + "]";
}
}
@ConfigMapping(prefix = "student", namingStrategy = ConfigMapping.NamingStrategy.SNAKE_CASE)
public interface StudentConfiguration {
/**
* 名字與設定項一致
* @return
*/
String name();
...
student.name=Tom
student.age=11
student.description=He is a good boy
student.address.province=guangdong
student.address.city=shenzhen
package com.bolingcavalry;
public interface Address {
String province();
String city();
}
student.address.province=guangdong
student.address.city=shenzhen
quarkus有很多內建的設定項,例如web服務的埠quarkus.http.port就是其中一個,如果您熟悉SpringBoot的話,對這些內建設定項應該很好理解,資料庫、訊息、快取,都有對應設定項
篇幅所限就不在此講解quarkus內建的設定項了,您可以參考這份官方提供的設定項列表,裡面有詳細說明:https://quarkus.io/guides/all-config
上述檔案中,有很多設定項帶有加鎖的圖示,如下圖紅框所示,有這個圖示的設定項,其值在應用構建的時候已經固定了,在應用執行期間始終保持唯讀狀態
這種帶有加鎖圖示的設定項的值,在應用執行期間真的不能改變了嗎?其實還是有辦法的,官方檔案指明,如果業務的情況特殊,一定要變,就走熱部署的途徑,您可以參考《quarkus實戰之四:遠端熱部署》
官方對開發者的建議:在開發quarkus應用的時候,不要使用quarkus作為設定項的字首,因為目前quarkus框架及其外掛們的設定項的字首都是quarkus,應用開發應該避免和框架使用相同的設定項字首,以免衝突
至此,咱們已經學習瞭如何在quarkus應用中使用設定項,接下來還會一起實踐更多的quarkus基礎知識,鎖定《quarkus實戰》專輯,欣宸不會辜負您的期待