Konfigurasi Aplikasi - Metadata Konfigurasi Pegas

Menyesuaikan aplikasi Anda dengan @ConfigurationProperties , sebagai alternatif untuk menggunakan @Value .

Dalam artikel itu

  • Mengatur dan mengubah fungsionalitas aplikasi melalui application.properties menggunakan ConfigurationProperties
  • Mengintegrasikan properti application.prop dengan IDE
  • Memeriksa Pengaturan

gambar

Perbedaan antara kedua pendekatan tersebut dijelaskan di sini - ConfigurationProperties vs. Nilai
Pada gambar di atas, komposisi utama dan prinsip operasi. Komponen yang tersedia dari sistem, ini adalah komponen Spring, hanya kelas, berbagai konstanta, variabel, dll dapat ditentukan dalam file application.properties, dan bahkan pada saat lingkungan pengembangan menunjukkannya, opsi akan ditawarkan, pemeriksaan dilakukan. Ketika aplikasi dimulai, nilai-nilai yang ditunjukkan akan diperiksa kepatuhannya dengan jenis, batasan, dan jika semuanya memuaskan, maka aplikasi akan mulai. Sebagai contoh, sangat mudah untuk mengkonfigurasi fungsionalitas aplikasi dari daftar komponen Spring yang tersedia, di bawah ini saya akan menunjukkan caranya.
Kelas properti

Untuk membuat pengaturan aplikasi menggunakan ConfigurationProperties, Anda bisa mulai dengan kelas properti. Ini sebenarnya menunjukkan properti, komponen sistem yang ingin kita konfigurasi.

AppProperties.java
 @ConfigurationProperties(prefix = "demo") @Validated public class AppProperties { private String vehicle; @Max(value = 999, message = "Value 'Property' should not be greater than 999") private Integer value; private Map<String,Integer> contexts; private StrategyEnum strategyEnum; private Resource resource; private DemoService service; public String getVehicle() { return vehicle; } public void setVehicle(String vehicle) { this.vehicle = vehicle; } public Map<String, Integer> getContexts() { return contexts; } public void setContexts(Map<String, Integer> contexts) { this.contexts = contexts; } public StrategyEnum getStrategyEnum() { return strategyEnum; } public void setStrategyEnum(StrategyEnum strategyEnum) { this.strategyEnum = strategyEnum; } public Resource getResource() { return resource; } public void setResource(Resource resource) { this.resource = resource; } public DemoService getService() { return service; } public void setService(DemoService service) { this.service = service; } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } @Override public String toString() { return "MyAppProperties{" + "\nvehicle=" + vehicle + "\n,contexts=" + contexts + "\n,service=" + service + "\n,value=" + value + "\n,strategyEnum=" + strategyEnum + '}'; } } 


Di kelas awalan = "demo" akan digunakan di application.properties, sebagai awalan ke properti.

Kelas aplikasi SpringApplication dan proyek pom.xml
 @SpringBootApplication @EnableConfigurationProperties({AppProperties.class}) @ImportResource(value= "classpath:context.xml") public class DemoConfigProcessorApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DemoConfigProcessorApplication.class, args); AppProperties properties = context.getBean(AppProperties.class); String perform = properties.getService().perform(properties.getVehicle()); System.out.println("perform: " + perform); System.out.println(properties.toString()); } } 

 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demoConfigProcessor</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demoConfigProcessor</name> <description>Demo project for Spring Boot Configuration Processor</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 


Lalu saya nyatakan dua tempat sampah

Konteks pegas (context.xml)
 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service1" class="com.example.demoConfigProcessor.MyDemoService1"> <description>Description MyDemoService 1</description> </bean> <bean id="service2" class="com.example.demoConfigProcessor.MyDemoService2"> <description>Description MyDemoService 2</description> </bean> </beans> 


Di kelas AppProperties, saya menunjukkan tautan ke beberapa layanan aplikasi yang tersedia, saya akan mengubahnya di application.properties, saya akan memiliki dua implementasinya dan saya akan menghubungkan salah satunya di application.properties.

gambar

Inilah implementasinya

Layanan Demo
 public interface DemoService { String perform(String value); } 

 public class MyDemoService1 implements DemoService { @Override public String perform(String value) { return "Service β„–1: perform routine maintenance work on <" + value +">"; } } 

 public class MyDemoService2 implements DemoService { @Override public String perform(String value) { return "Service β„–2: perform routine maintenance work on <" + value +">"; } } 


Ini sekarang cukup untuk mulai menyesuaikan application.properties. Tetapi setiap kali perubahan dibuat ke kelas dengan ConfigurationProperties, Anda perlu membangun kembali proyek, setelah itu file muncul di proyek
\target\classes\META-INF\spring-configuration-metadata.json . Sebenarnya, IDE-nya digunakan untuk mengedit dalam file application.properties. Saya akan menunjukkan strukturnya di tautan dalam materi. File ini akan dibuat berdasarkan kelas AppProperties. Jika Anda sekarang membuka file application.properties dan mulai mengetik "demo", lingkungan akan mulai menunjukkan properti yang tersedia

gambar

Jika Anda mencoba memasukkan jenis yang salah, IDE akan melaporkan

gambar

Bahkan jika Anda membiarkannya apa adanya dan mencoba menjalankan aplikasi, akan ada kesalahan yang sangat berbeda

gambar
Menambahkan metadata tambahan

Metadata tambahan, ini hanya untuk kenyamanan bekerja dengan application.properties di IDE, jika ini tidak perlu, Anda tidak bisa melakukannya. Untuk melakukan ini, dimungkinkan untuk menentukan petunjuk dan informasi lain untuk lingkungan dalam file tambahan. Untuk melakukan ini, salin file spring-configuration-metadata.json yang dibuat ke \src\main\resources\META-INF\ dan ganti nama menjadi
additional-spring-configuration-metadata.json . Dalam file ini, saya hanya akan tertarik pada bagian petunjuk: []

Di dalamnya akan dimungkinkan untuk membuat daftar, misalnya, nilai yang valid untuk demo.vehicle

 "hints": [ { "name": "demo.vehicle", "values": [ { "value": "car make A", "description": "Car brand A is allowed." }, { "value": "car make B", "description": "Car brand B is allowed." } ] }] 

Di bidang "nama", properti "demo.vehicle" ditunjukkan, dan dalam "nilai" daftar nilai yang valid. Sekarang jika saya membangun kembali proyek dan pergi ke file application.properties, maka ketika saya memasukkan demo.vehicle saya mendapatkan daftar nilai yang valid

gambar

Ketika Anda memasukkan jenis yang berbeda dari yang diusulkan, tetapi dari jenis yang sama, editor akan menyorot, tetapi aplikasi akan mulai dalam kasus ini, karena ini bukan pembatasan ketat, tetapi hanya sebuah petunjuk.

gambar

Sebelumnya dalam proyek ini, saya mengumumkan dua layanan MyDemoService1 dan MyDemoService2, keduanya mengimplementasikan antarmuka DemoService, sekarang Anda dapat mengonfigurasi sehingga hanya layanan yang mengimplementasikan antarmuka ini yang dapat diakses ke application.properties dan, oleh karena itu, kelas yang dipilih diinisialisasi dalam kelas AppProperties. Untuk melakukan ini, ada Penyedia, Anda dapat menentukan mereka di tambahan-pegas-konfigurasi-metadata. Ada beberapa jenis penyedia yang dapat ditemukan dalam dokumentasi, saya akan menunjukkan contoh untuk satu, spring-bean-reference . Jenis ini menunjukkan nama-nama kacang yang tersedia dalam proyek saat ini. Daftar ini terbatas pada kelas dasar atau antarmuka.

Contoh penyedia untuk DemoService:

  "hints": [ { "name": "demo.service", "providers": [ { "name": "spring-bean-reference", "parameters": { "target": "com.example.demoConfigProcessor.DemoService" } } ] } ] 

Setelah itu, dalam application.properties untuk parameter layanan demo.ser, pilihan dua layanan akan tersedia, Anda dapat melihat deskripsi mereka (deskripsi dari definisi).

gambar

Sekarang nyaman untuk memilih layanan yang tepat, mengubah fungsionalitas aplikasi. Ada satu titik untuk pengaturan objek, Spring membutuhkan sedikit bantuan untuk mengubah string yang ditentukan dalam pengaturan menjadi objek. Untuk melakukan ini, kelas kecil diwarisi dari Konverter.

ServiceConverter
 @Component @ConfigurationPropertiesBinding public class ServiceConverter implements Converter<String, DemoService> { @Autowired private ApplicationContext applicationContext; @Override public DemoService convert(String source) { return (DemoService) applicationContext.getBean(source); } } 


Diagram kelas proyek menunjukkan bagaimana layanan ini dipisahkan dari aplikasi utama dan dapat diakses melalui AppProperties.

gambar
Properti validasi
Ke bidang-bidang kelas AppProperties, Anda dapat menambahkan cek yang tersedia dalam kerangka JSR 303. Saya menulis tentang ini di sini . Ini akan menghasilkan file konfigurasi aplikasi yang mudah diverifikasi dan nyaman.

Output konsol

gambar

Struktur proyek

gambar

File lengkap tambahan-pegas-konfigurasi-metadata.json

tambahan-pegas-konfigurasi-metadata
 { "groups": [ { "name": "demo", "type": "com.example.demoConfigProcessor.AppProperties", "sourceType": "com.example.demoConfigProcessor.AppProperties" } ], "properties": [ { "name": "demo.contexts", "type": "java.util.Map<java.lang.String,java.lang.Integer>", "sourceType": "com.example.demoConfigProcessor.AppProperties" }, { "name": "demo.vehicle", "type": "java.lang.String", "sourceType": "com.example.demoConfigProcessor.AppProperties" } ], "hints": [ { "name": "demo.vehicle", "values": [ { "value": "car make A", "description": "Car brand A is allowed." }, { "value": "car make B", "description": "Car brand B is allowed." } ] }, { "name": "demo.service", "providers": [ { "name": "spring-bean-reference", "parameters": { "target": "com.example.demoConfigProcessor.DemoService" } } ] } ] } 


Bahan Metadata Konfigurasi

Source: https://habr.com/ru/post/id430256/


All Articles