YAML構文は「YAMLファイルの基本的な文法」を参照できます
Application.propertiesとapplication.ymlはSpringBoot構成ファイルであり、これらはsrc/main/resources
ディレクトリにあり、デフォルトの構成を変更するために使用されます。
1.最初にsrc/main/resources
ディレクトリにapplication.yml を作成します
~/Desktop/MySpringboot$ touch src/main/resources/application.yml
2. application.ymlに次の設定情報を追加します
server:
port: 8088
person:
lastName: Sam
age: 18
boss: false
birth: 2020/03/21
maps: {k1: v1,k2: v2}
lists:
- Tom
- Sam
dog:
name: small dog
age: 2
application.propertiesファイルが設定に使用されている場合、上記のデータは次と同等です。
server.port=8088
person.lastName=Sam
person.age=18
person.boss=false
person.birth=2020/03/21
person.maps.k1=v1
person.maps.k2=v2
person.lists=Tom,Sam
person.dog.name=small dog
person.dog.age=2
3.構成ファイルの属性値をこのクラスにマップするPersonクラスを作成します
Person.java
package com.wong.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person":配置文件中哪个下面的所有属性值进行一一映射
* 注意:只有这个组件是容器的组件,才能使用容器提供的ConfigurationProperties功能
*/
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person{
private String lastName;
private int age;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
// 省略setter、getter方法
}
- @ConfigurationProperties:このクラスのすべてのプロパティを構成ファイル内の関連する構成にバインドするようにSpringBootに指示します。prefix= "person":構成ファイル内のすべてのプロパティ値の1対1のマッピング。
- @Configurationは、構成クラスを定義するために使用されます。注釈付きクラスには、@ Beanで注釈が付けられた1つ以上のメソッドが含まれます。これらのメソッドは、AnnotationConfigApplicationContextまたはAnnotationConfigWebApplicationContextクラスによってスキャンされ、Bean定義の構築およびSpringコンテナの初期化に使用されます。
- Springの@Beanアノテーションを使用して、Beanオブジェクトが生成されたことをメソッドに通知し、このBeanオブジェクトがSpring管理に渡されます。このBeanオブジェクトを生成するメソッドSpringは1回だけ呼び出され、このSpringはこのBeanオブジェクトを独自のIOCコンテナに配置します
実際、@ Valueアノテーションを使用して値をバインドすることもできます。
@Configuration
//@ConfigurationProperties(prefix = "person")
public class Person{
@Value("${person.lastName}")
private String lastName;
@Value("${person.age}")
private int age;
@Value("${person.boss}")
private boolean boss;
@Value("${person.birth}")
private Date birth;
@Value("${person.maps}") // 失败
private Map<String,Object> maps;
@Value("${person.lists}") // 失败
private List<Object> lists;
@Value("${person.dog}") // 失败
private Dog dog;
// 省略setter、getter方法
}
@Valueと@ConfigurationPropertiesの違いを比較します。
@ConfigurationProperties | @値 | |
---|---|---|
機能 | 構成ファイルへの属性の一括注入 | 一つずつ指定 |
ゆるい文法 | サポート、つまり、lastName、last_name、LAST_NAMEは同じと見なされます | サポートされていません |
ゲーム | サポートされていません | サポート、例1を参照 |
JSR303データ検証 | サポート、例2を参照 | サポートされていません |
複合型包装 | 応援 | サポートされていません |
したがって、複合型のカプセル化がある場合、または構成項目をマップするためにjavaBeanが定義されている場合は、@ ConfigurationPropertiesを使用します。属性を単独で使用する場合は、@ Valueを使用します。
例1:
@Configuration
public class Person{
@Value("#{10*2}")
private int age;
// 省略setter、getter方法
}
例2:
@Configuration
@ConfigurationProperties(prefix = "person")
@Validated
public class Person{
@mail
private String lastName; // 必须符合邮件格式
...
}
4.構成情報を使用する
@RestController
@RequestMapping("world")
public class HelloWorldController{
@Autowired
private Person person;
@GetMapping("hi")
public String index(){
return person.getLastName();
}
}
@Autowiredは、クラスメンバー変数、メソッド、およびコンストラクターに注釈を付けることができる注釈であり、SpringがBeanの自動アセンブリを完了できるようにします。
5.実行してテストする
実行:
~/Desktop/MySpringboot$ mvn spring-boot:run
ブラウザでテストします。
6.単体テスト
src / test / java / com / wongの下にテストクラスを作成します。
package com.wong;
import com.wong.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootConfigTests {
@Autowired
private Person person;
@Test
public void testPerson(){
System.out.println(person.getLastName()+"kkkkk");
}
}
SpringBootConfigTests.javaを右クリックしてRUN 'SpringBootConfigTests'をクリックし、テストクラスを実行
します。テストに合格しました。読んでくれてありがとう!