IDEAのSpringInitializerは、SpringBootプロジェクトをすばやく作成します
IDEはすべて、Springのプロジェクト作成ウィザードを使用してSpring Bootプロジェクトをすばやく作成することをサポートしています。
必要なモジュールを選択します。
ウィザードは、インターネット上にSpring Bootプロジェクトを作成します。
デフォルトで生成された、Spring Bootプロジェクトです。
メインプログラムが生成されました。必要なのは、独自のプログラムだけです。ロジック
生成されたリソースフォルダ内のディレクトリ構造
- static:すべての静的リソースを保存します; jscssイメージ;
- テンプレート:すべてのテンプレートページを保存します;(Spring Bootのデフォルトのjarパッケージは埋め込みTomcatを使用し、JSPページはデフォルトではサポートされていません);テンプレートエンジン(freemarker、thymeleaf)を使用できます;
- application.properties:SpringBootアプリケーション構成ファイル。一部のデフォルト設定は変更できます。
構成ファイル
SpringBootはグローバル構成ファイルを使用し、構成ファイル名は固定されています; application.propertiesおよびapplication.yml
構成ファイルの役割:SpringBoot自動構成のデフォルト値を変更します。SpringBootは下部で自動的に構成します。
接尾辞名がymlの場合、フルネームはyamlです。YAML
(YAMLはマークアップ言語ではありません)は
YAMLとして理解できます。マークアップ言語:はマークアップ言語である
か、
YAMLはマークアップ言語ではありません。
マークアップ言語ではありません。マークアップ言語:
以前の構成ファイル;それらのほとんどはxxxx.xmlファイルを使用します;
YAML:データ中心であり、json、xmlなどよりも構成ファイルに適しています。
YAML:構成例
server:
port: 8081
前のxmlの対応する構成例
<server>
<port>8081</port>
</server>
YAML構文
基本的な文法
k :(スペース)v :(スペースが存在する必要がある)キーと値のペアのペアを表します;
階層関係はスペースのインデントによって制御されます;データの列が左揃えである限り
、同じレベルの属性と値も大文字と小文字が区別されます;
バリューライティング
-
文字値:通常の値(数値、文字列、ブール値)
k:v:文字通り直接書き込む;
文字列のデフォルトは一重引用符または二重引用符を追加する必要はありません;
"":二重引用符;文字列内の特殊文字をエスケープしません文字;特殊文字は表現したい
名前になります: "zhangsan \ n lisi":出力; zhangsan newline lisi
'':一重引用符;特殊文字はエスケープされます。特殊文字は単なる通常の文字列データ
名です: ' zhangsan \ n lisi ':出力; zhangsan \ n lisi -
オブジェクト、マップ(属性と値)(キーと値のペア)
k:v:オブジェクトの属性と値の関係を次の行に書き込みます;インデント
はまだk:vであることに注意してください
friends:
lastName: zhangsan
age: 20
インライン書き込み:
friends: {
lastName: zhangsan,age: 18}
- Array(List、Set)
uses-valueは、配列内の要素を表します
pets:
‐ cat
‐ dog
‐ pig
インライン書き込み
pets: [cat,dog,pig]
プロファイルインジェクション
書き込まれる最初の構成ファイルは
person:
lastName: hello
age: 18
boss: false
birth: 2019/12/26
maps: {
k1: v1,k2: v2}
lists:
- lisi
- zhangsan
dog:
name: 狗
age: 12
対応するJavaBeanは
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉springboot将本类中的所有的属性和配置文件中相关的配置进行绑定
* prefix = "person":以配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器的组件,才能让容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource("classpath:application.yaml")
public class Person
{
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
テストユニットでテストする
/**
* spring boot单元测试
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@SpringBootTest
class TestApplicationTests
{
@Autowired
Person person;
@Test
void contextLoads()
{
System.out.println("================================================");
System.out.println(person);
}
}
結果
application.propertiesインジェクションに変更します
person.last-name=小杨
person.age=18
person.birth=2020/12/26
person.boss=false
person.maps.v1=擎天柱
person.maps.v2=28
person.lists=1,2,3
person.dog.name=狗狗
person.dog.age=5
中国の文字化けの問題が発生するだけです。この記事を参照してください
@valueを使用してデータをバインドします
以前は、@ ConfigurationProperties(prefix = "person")を使用して構成ファイルのデータをバインドしていましたが、現在は@Valueに変更されています。Spring
でのValueの役割と使用法は同じです。Spring
を使用してBeanを構成する前にこんな感じでした
<bean class="Person">
<property name="lastname" value=""></property>
</bean>
現在の@Valueは、上記の使用法の値に似ており、金種で記述することもできます。$(key)は、環境変数#{Spel}式から値を取得して結果を取得します。
@Valueが値を取得し、@ ConfigurationPropertiesが値を取得します
@ConfigurationProperties | @値 | |
特徴 | 構成ファイルへのプロパティの一括注入 | 1つずつ指定します |
緩いバインディング(緩い構文は、person.firstName:標準メソッドを使用、person.first-name:大文字を使用、person.first_name:大文字に_を使用、上記の3つのメソッドは緩い構文で考慮されるなどの属性名の一致ルールです。それらは同じ変数です) | 待機する | サポートしません |
SpEL(春の表現言語) | サポートしません | 待機する |
JSR303データ検証 | 待機する | サポートしません |
最大の違い:マップパッケージなどの複雑なタイプのパッケージ | 待機する | サポートしません |
特定のビジネスロジックの構成ファイルで値を取得する必要がある場合は、@ Valueを使用します。構成ファイルをマップするjavaBeanを作成する場合は、@ ConfigurationPropertiesを直接使用します。
JSR303データ検証は、バインドされたデータが、電子メールアドレスを満たしているかどうかなど、挿入時に要件を満たしているかどうかを検証することです。
検証のために@Validatedと@emailを追加します。
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person
{
@email
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@ PropertySource&@ ImportResource&@ Bean
@PropertySource
指定された構成ファイルをロードします。
以前に使用された@ConfigurationProperties(prefix = "")は、デフォルトでグローバル構成ファイルから値を取得しますが、構成ファイルに
すべてを書き込むと、構成ファイルのデータが多すぎます。そのため、JavaBeanデータの一部を抽出して他の構成ファイルに配置します。現時点では、この注釈を使用して他の構成ファイルの値を取得する必要があります。
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
@PropertySource(value = "classpath:person.properties")
public class Person
{
// @Value("哆啦A梦")
// @email
private String lastName;
// @Value("${person.age}")
private Integer age;
// @Value("#{1==1}")
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@ImportResource
Spring構成ファイルをインポートして、構成ファイルの内容を有効にします。SpringBootにはSpring構成ファイル
がなく、自分で作成した構成ファイルを自動的に認識できません
。Spring構成ファイルを有効にする場合は、ロードします。@ ImportResourceはでマークされています。構成クラス
をメイン構成クラスに直接追加します
@ImportResource(locations ={
"classpath:bean.xml"} )
@SpringBootApplication
public class TestApplication
{
public static void main(String[] args)
{
SpringApplication.run(TestApplication.class, args);
}
}
Spring構成ファイルbean.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="dog" class="jane.test.bean.Dog"></bean>
</beans>
テスト
@Autowired
ApplicationContext ioc;
@Test
public void test()
{
boolean dog = ioc.containsBean("dog");
System.out.println(dog);
}
结果是true的
@豆
上記の例で、スプリングコンテナにコンポーネントを追加する場合、スプリングブートでは、小枝構成ファイルを書き込んでからロードすることはお勧めしません。
スプリングブートでは、構成クラスを使用することをお勧めします。この構成クラスは、個別に作成することも、メインで作成することもできます。
構成クラスでは、この構成クラスは前のSpring構成ファイルと同等です。
package jane.test.jane.config;
import jane.test.bean.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author jane
* @create 2020-08-05 1:48
*
* @Configuration:就是指明当前类是一个配置类,
* 就是用来替代之前的spring的配置文件
*/
@Configuration
public class Myconfig
{
//将方法中返回值添加到容器中,容器中的这个组件的默认的id就是方法名
@Bean
public Dog dog()
{
System.out.println("增加了一个狗");
return new Dog();
}
}
構成ファイルのプレースホルダー
乱数
${
random.value}、${
random.int}、${
random.long}
${
random.int(10)}、${
random.int[1024,65536]}
プレースホルダーは以前に構成された値を取得します。そうでない場合は、使用できます。デフォルト値を指定します
person.last-name=小杨${
random.uuid}
person.age=${
random.int}
person.birth=2020/12/26
person.boss=false
person.maps.v1=擎天柱
person.maps.v2=28
person.lists=1,2,3
person.dog.name=${
person.last-name}的狗
person.dog.age=5