很多優(yōu)秀的框架都有自己的配置文件爹袁, 比如hibernate有hbm铝噩,mybatis 有properties配置文件趟庄。
Springboot使用一個(gè)全局的配置文件显拳,而且配置文件的名字是固定的棚愤。 有兩種
- application.properties
- application.yml
springboot 配置文件的作用是用來 修改SpringBoot自動(dòng)配置的默認(rèn)值;SpringBoot在底層都給我們自動(dòng)配置好杂数; 像我們Tomcat 啟動(dòng) 默認(rèn)配置端口是8080 . 如果要修改宛畦, 我們就在這兩個(gè)文件的一種中來修改,
-
YML (也叫YAML : YAM Ain't Markup Language)**
YAML Ain't Markup Language 這是一個(gè)遞歸寫法 揍移;
- YAML A Markup Language:是一個(gè)標(biāo)記語言
- YAML isn't Markup Language:不是一個(gè)標(biāo)記語言次和;
標(biāo)記語言: 我們以前用的配置文件,大多都使用 xxxx.xml 文件 那伐;
YAML : 是一種以數(shù)據(jù)為中心的配置文件踏施, 比json,xml 等更適合做配置文件
舉個(gè)栗子:
以 修改端口為例 :
yml :
server:
port: 8081
xml :
<server>
<port>8081</port>
</server>
xml 配置 將太多的浪費(fèi)在了標(biāo)簽上面。
yml 基本語法:
k:(空格)v:表示一對鍵值對(空格必須有)罕邀;
以 空格 的縮進(jìn)來控制層級(jí)關(guān)系畅形;只要是左對齊的一列數(shù)據(jù),都是同一個(gè)層級(jí)的
server:
port: 8081
path: /hello
屬性和值也是大小寫敏感诉探;
值的寫法:
-
字面量:普通的值(數(shù)字日熬,字符串,布爾)
k: v:字面直接來寫肾胯;
字符串默認(rèn)不用加上單引號(hào)或者雙引號(hào)竖席;
"":雙引號(hào);不會(huì)轉(zhuǎn)義字符串里面的特殊字符阳液;特殊字符會(huì)作為本身想表示的意思
name: "zhangsan \n lisi":輸出怕敬;zhangsan 換行 lisi
'':單引號(hào);會(huì)轉(zhuǎn)義特殊字符帘皿,特殊字符最終只是一個(gè)普通的字符串?dāng)?shù)據(jù)
-
對象、Map(屬性和值)(鍵值對):
k: v:在下一行來寫對象的屬性和值的關(guān)系畸陡;注意縮進(jìn)
對象還是k: v的方式
friends:
lastName: zhangsan
age: 20
行內(nèi)寫法:
friends: {lastName: zhangsan,age: 18}
-
配置文件注入
javaBean :
可以導(dǎo)入配置文件處理器依賴鹰溜,以后編寫配置就會(huì)有代碼提示虽填;
代碼展示配置文件注入屬性值 :
package com.example.webservice.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
*
* ConfigurationProperties(prefix ="person") 將本類中的所有屬性和配置文件中的相關(guān)配置進(jìn)行綁定
* prefix ="person 表示對哪個(gè)文件進(jìn)行綁定
* Component 表示這是一個(gè)容器, 只有在容器中 ConfigurationProperties 才能使用
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean man;
private Date birth;
private Map<String,Object>map;
private List<Object>list ;
private Son son ;
.....省略get/set 以及toString 方法
}
package com.example.webservice.bean;
public class Son {
private String name;
private Integer age ;
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Son{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
properties文件綁定的寫法
person.name=爸爸
person.age=45
person.man=true
person.birth=2019/8/8
person.map.k1=h1
person.map.k2=h2
person.list=a,1,son
person.son.name=兒子
person.son,age=20
yml 文件綁定的寫法:
person:
name: 爸爸
age: 25
birth: 2018/2/8
man: true
list:
- a
- 2
- son
map: {key1:value1,key2:value2}
son:
name: 兒子
age: 5
測試類 : 在我們的test 文件夾下 :
package com.example.webservice;
import com.example.webservice.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 WebserviceApplicationTests {
@Autowired
Person person;
@Test
public void contextLoads() {
// 直接運(yùn)行這個(gè)方法 曹动,而不是運(yùn)行整個(gè)程序
System.out.println(person);
System.out.println("********************************************************");
}
}
1斋日、什么是yml什么是properties?
對于剛接觸springboot的同學(xué),肯定存在一時(shí)搞不清楚yml和properties配置文件有什么區(qū)別墓陈。首先恶守,無論是yml還是properties,都是SpringBoot配置文件中的一種格式贡必,默認(rèn)名為application.yml或application.properties 兔港,默認(rèn)放在resources文件夾下,當(dāng)然仔拟,放在resources/config文件夾下也是可以讀取到的衫樊。
2、各自的優(yōu)點(diǎn)利花?
下面我們以配置redis緩存數(shù)據(jù)庫的配置文件為例子進(jìn)行說明:
yml格式配置文件:
properties格式配置文件:
可以看到科侈,yml格式的配置文件有著可讀性更強(qiáng)的樹型結(jié)構(gòu),也更加簡潔炒事,但對于新手而言臀栈,properties格式的配置文件也是不錯(cuò)的選擇,易于理解挠乳,總之挂脑,兩種格式的配置文件殊途同歸,springboot項(xiàng)目都可以識(shí)別欲侮。
3崭闲、yml格式配置文件寫法和坑點(diǎn)
對于properties格式的配置文件,我無需多言威蕉,所有學(xué)習(xí)springboot的同學(xué)最開始接觸的還是properties格式的配置文件刁俭。那么properties格式配置文件如何轉(zhuǎn)yml格式呢?
(1)不同等級(jí)用冒號(hào)隔開韧涨,次等級(jí)前用空格牍戚,不能用制表符tab,如spring.redis.host=127.0.0.1配置文件中虑粥,spring作為第一級(jí)如孝,redis作為第二級(jí).
(2)如果冒號(hào)后是值,則用一個(gè)空格將冒號(hào)和值隔開娩贷。
(3)坑點(diǎn):yml格式中一定不要用制表符tab,冒號(hào)和值之間一定要有空格第晰。
4、總結(jié)
兩種配置文件在 springboot中都可以識(shí)別,用其中一種就可以茁瘦。如果一個(gè)目錄下存在兩種格式的配置文件品抽,則先讀取properties格式的配置文件,后讀取yml格式的配置文件甜熔。讀取到的配置以第一次的為準(zhǔn)圆恤。
控制臺(tái)打印結(jié)果 (使用的 yml 配置文件)
properties配置文件在idea中默認(rèn)utf-8可能會(huì)亂碼 。因?yàn)閟pring properties 默認(rèn)是ASCII 碼 腔稀,所以需要將properties 默認(rèn)編碼改為UTP-8 盆昙,再√上旁邊的 將其運(yùn)行時(shí)轉(zhuǎn)換為ASCII碼;再輸入中文就好了
都改成utf-8 焊虏,再輸入中文就好了淡喜。
-
@Value獲取值和@ConfigurationProperties獲取值比較**
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個(gè)個(gè)指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數(shù)據(jù)校驗(yàn) | 支持 | 不支持 |
復(fù)雜類型封裝 | 支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值;
如果說炕淮,我們只是在某個(gè)業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項(xiàng)值拆火,使用@Value;
如果說涂圆,我們專門編寫了一個(gè)javaBean來和配置文件進(jìn)行映射们镜,我們就直接使用@ConfigurationProperties;
-
配置文件注入值數(shù)據(jù)校驗(yàn)
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="name" value="字面量/${key}從環(huán)境變量润歉、配置文件中獲取值/#{SpEL}"></property>
* <bean/>
*/
//name必須是郵箱格式
@Email
//@Value("${person.name}")
private String name;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
模狭。。踩衩。嚼鹉。。get/set /toString
@PropertySource&@ImportResource&@Bean
@PropertySource:加載指定的配置文件驱富;
/**
* 將配置文件中配置的每一個(gè)屬性的值锚赤,映射到這個(gè)組件中
* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定;
* prefix = "person":配置文件中哪個(gè)下面的所有屬性進(jìn)行一一映射
*
* 只有這個(gè)組件是容器中的組件褐鸥,才能容器提供的@ConfigurationProperties功能线脚;
* @ConfigurationProperties(prefix = "person")默認(rèn)從全局配置文件中獲取值;
*
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
/**
* <bean class="Person">
* <property name="name" value="字面量/${key}從環(huán)境變量叫榕、配置文件中獲取值/#{SpEL}"></property>
* <bean/>
*/
//name必須是郵箱格式
// @Email
//@Value("${person.name}")
private String name;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
@ImportResource:導(dǎo)入Spring的配置文件浑侥,讓配置文件里面的內(nèi)容生效;
Spring Boot里面沒有Spring的配置文件晰绎,我們自己編寫的配置文件寓落,也不能自動(dòng)識(shí)別;
想讓Spring的配置文件生效荞下,加載進(jìn)來伶选;就要將 @ImportResource 標(biāo)注在一個(gè)配置類上
@ImportResource(locations = {"classpath:beans.xml"})//類路徑上添加配置類的路徑
導(dǎo)入Spring的配置文件讓其生效
不來編寫Spring的配置文件 史飞,下面這就是我們通常的Spring配置類文件
<?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="helloService" class="com.example.webservice.controller.Hello"></bean>
</beans>
SpringBoot推薦給容器中添加組件的方式;推薦使用全注解的方式
1考蕾、配置類@Configuration------>Spring配置文件
2祸憋、使用@Bean給容器中添加組件
/**
* @Configuration:指明當(dāng)前類是一個(gè)配置類会宪;就是來替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>標(biāo)簽添加組件
*
*/
@Configuration
public class MyAppConfig {
//將方法的返回值添加到容器中肖卧;容器中這個(gè)組件默認(rèn)的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
配位文件占位符
1、隨機(jī)數(shù)
${random.value}掸鹅、${random.int}塞帐、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2巍沙、占位符獲取之前配置的值葵姥,如果沒有可以是用:指定默認(rèn)值
properties
person.name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
// 如果沒有hello這個(gè)屬性, 則會(huì)直接輸出 ${person.hello} 句携, 如果加了 ${person.hello:hello}_dog 則會(huì)直接賦值 輸出
hello_dog
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
3榔幸、Profile
1、多Profile文件
我們在主配置文件編寫的時(shí)候矮嫉,文件名可以是 application-{profile}.properties/yml
springboot默認(rèn)使用配置文件為application.properties削咆;
所以我們在然后在application.properties配置文件中 激活自定義的環(huán)境配置文件就可以了從application.properties 加載到application-dev.properties 文件了
在配置文件中指定 spring.profiles.active=dev
2、yml支持多文檔塊方式
server:
port: 8081
spring:
profiles:
active: prod 表示當(dāng)前激活使用哪個(gè)環(huán)境 --- 表示環(huán)境的分割 蠢笋,分成不同的文檔塊拨齐。
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定屬于哪個(gè)環(huán)境
4、激活指定profile
? 1昨寞、在配置文件中指定 spring.profiles.active=dev
? 2瞻惋、命令行:
? java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
? 可以直接在測試的時(shí)候援岩,配置傳入命令行參數(shù) 歼狼,打包好的項(xiàng)目運(yùn)行的時(shí)候指定我們的環(huán)境:
? 3、虛擬機(jī)參數(shù)享怀; 在運(yùn)行的時(shí)候 選擇Editor configrations
-Dspring.profiles.active=dev
5羽峰、配置文件加載位置
springboot 啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認(rèn)配置文件
–file:./config/ 文件路徑config目錄--->最高優(yōu)先級(jí)
–file:./ 文件路徑根目錄--->其次
–classpath:/config/ 類路徑config目錄--->再其次
–classpath:/ 類路徑根目錄--->最低優(yōu)先級(jí)
優(yōu)先級(jí)由高到底,高優(yōu)先級(jí)的配置會(huì)覆蓋低優(yōu)先級(jí)的配置凹蜈;
SpringBoot會(huì)從這四個(gè)位置全部加載主配置文件:互補(bǔ)配置限寞;
我們還可以通過spring.config.location來改變默認(rèn)的配置文件位置
項(xiàng)目打包好以后,我們可以使用命令行參數(shù)的形式仰坦,啟動(dòng)項(xiàng)目的時(shí)候來指定配置文件的新位置履植;指定配置文件和默認(rèn)加載的這些配置文件共同起作用形成互補(bǔ)配置;
進(jìn)入命令行 :
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties(properties的硬盤文件目錄)
6悄晃、外部配置加載順序
SpringBoot也可以從以下位置加載配置玫霎; 優(yōu)先級(jí)從高到低凿滤;高優(yōu)先級(jí)的配置覆蓋低優(yōu)先級(jí)的配置,所有的配置會(huì)形成互補(bǔ)配置
1.命令行參數(shù)
所有的配置都可以在命令行上進(jìn)行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多個(gè)配置用空格分開庶近; --配置項(xiàng)=值
2.來自java:comp/env的JNDI屬性
3.Java系統(tǒng)屬性(System.getProperties())
4.操作系統(tǒng)環(huán)境變量
5.RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內(nèi)進(jìn)行尋找翁脆;
優(yōu)先加載帶profile
7.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
8.jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile
9.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
10.jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件
11.@Configuration注解類上的@PropertySource
12.通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性
所有支持的配置加載來源;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.yml文件
name: hha
age: 60
friend:
- good
- easy
- bug
params:
addr: ZZ
code: EE
name: 洗洗
3.實(shí)體類
package com.my.last;
import java.util.List;
import java.util.Map;
public class Student { private String name;
private int age;
private List<String> friend ;
private Map<String, Object> params; /**
* @return the name */ public String getName() {
return name; }
/**
* @param name the name to set */ public void setName(String name) { this.name = name; }
/**
* @return the age */ public int getAge() { return age; }
/**
* @param age the age to set */ public void setAge(int age) { this.age = age; }
/**
* @return the friend */ public List<String> getFriend() { return friend; }
/**
* @param friend the friend to set */ public void setFriend(List<String> friend) { this.friend = friend; }
/**
* @return the params */ public Map<String, Object> getParams() { return params; }
/**
* @param params the params to set */ public void setParams(Map<String, Object> params) { this.params = params; }
/* (non-Javadoc)
* @see java.lang.Object#toString() */ @Override
public String toString() { return "Student [name=" + name + ", age=" + age + ", friend=" + friend + ", params=" + params + "]"; } }
4.測試類
package com.my.last;
import org.yaml.snakeyaml.Yaml;
public class Test { public static void main(String[] args) {
Yaml yaml = new Yaml();
Student student = yaml.loadAs(Test.class.getResourceAsStream("/test.yml"), Student.class);
System.out.println(student); }
}
** 或者依賴**
<dependency>
<groupId>org.jyaml</groupId>
<artifactId>jyaml</artifactId>
<version>1.3</version>
</dependency>
解析方法:
Student student2 = null; try {
student2 = org.ho.yaml.Yaml.loadType(Test.class.getResourceAsStream("/test.yml"), Student.class);
} catch (FileNotFoundException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(student2);</pre>
二者區(qū)別
在于其擁有天然的樹狀結(jié)構(gòu)鼻种,所以著手嘗試將properties文件更改為yml文件反番,發(fā)現(xiàn)了幾個(gè)要注意的地方:
1、在properties文件中是以”.”進(jìn)行分割的叉钥, 在yml中是用”:”進(jìn)行分割;
2罢缸、yml的數(shù)據(jù)格式和json的格式很像,都是K-V格式投队,并且通過”:”進(jìn)行賦值枫疆;
3、在yml中縮進(jìn)一定不能使用TAB敷鸦,否則會(huì)報(bào)很奇怪的錯(cuò)誤息楔;(縮進(jìn)特么只能用空格!0桥V狄馈!)
4谎碍、yml每個(gè)k的冒號(hào)后面一定都要加一個(gè)空格鳞滨;
5、使用spring cloud的maven進(jìn)行構(gòu)造的項(xiàng)目蟆淀,在把properties換成yml后拯啦,一定要進(jìn)行mvn clean insatll
6、yml是跨語言的:可以在包括JAVA熔任,go褒链,python等大量的語言中使用,比如做云計(jì)算使用go和java的時(shí)候疑苔,可以通過配置中心使用同一份配置甫匹!
7、支持列表:區(qū)別于properties只支持鍵值對數(shù)據(jù)惦费,yml配置文件支持列表兵迅,如下所示:
當(dāng)然,從properties轉(zhuǎn)yml文件會(huì)遇到很多坑薪贫,在此記錄下:
1恍箭,層級(jí)關(guān)系縮進(jìn)不能用tab鍵:每次都數(shù)2.4.6這樣打空格。瞧省。扯夭。
2鳍贾,每個(gè)key的后面需要加:,每個(gè):后面還需要加一個(gè)空格交洗!
3骑科,列表的短橫線后面需要有個(gè)空格。
兩個(gè)關(guān)鍵點(diǎn):
第一個(gè)是yml是支持中文內(nèi)容的构拳,properties想使用中文只能用unicode編碼
第二個(gè)是順序問題咆爽,properties是不保證加載順序的,yml有先后順序隐圾,實(shí)際用例比如springcloud的zuul網(wǎng)關(guān)路由配置伍掀,如果一個(gè)uri同時(shí)滿足兩個(gè)匹配規(guī)則掰茶,properties你是不知道它到底使用了哪個(gè)規(guī)則的暇藏,而yml則一定是使用了靠后的那個(gè)路由規(guī)則
Java 的 Properties 加載屬性文件后是無法保證輸出的順序與文件中一致的,因?yàn)?Properties 是繼承自 Hashtable 濒蒋, key/value 都是直接存在 Hashtable 中的盐碱,而 Hashtable 是不保證進(jìn)出順序的。
總有時(shí)候會(huì)有關(guān)心順序一致的需求沪伙,恰如有 org.apache.commons.collections.OrderdMap(其實(shí)用 LinkedHashMap 就是保證順序) 一樣瓮顽,我們也想要有個(gè) OrderdProperties。
詳見: https://blog.csdn.net/qq1169091731/article/details/53012071
Spring Boot中application.properties和application.yml加載順序
使用@PropertySource注解加載自定義配置文件围橡,該注解無法加載yml配置文件暖混。使用@Value注解獲得文件中的參數(shù)值
application.properties和application.yml文件可以放在一下四個(gè)位置:
- 外置,在相對于應(yīng)用程序運(yùn)行目錄的/congfig子目錄里翁授。
- 外置拣播,在應(yīng)用程序運(yùn)行的目錄里
- 內(nèi)置,在config包內(nèi)
- 內(nèi)置收擦,在Classpath根目錄
同樣贮配,這個(gè)列表按照優(yōu)先級(jí)排序,也就是說塞赂,src/main/resources/config下application.properties覆蓋src/main/resources下application.properties中相同的屬性泪勒,如圖:
[圖片上傳失敗...(image-9f4435-1604553023059)]
此外,如果你在相同優(yōu)先級(jí)位置同時(shí)有application.properties和application.yml宴猾,那么application.properties里面的屬性就會(huì)覆蓋里application.yml的屬性
package com.example.webservice.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
*
* ConfigurationProperties(prefix ="person") 將本類中的所有屬性和配置文件中的相關(guān)配置進(jìn)行綁定
* prefix ="person 表示對哪個(gè)文件進(jìn)行綁定
* Component 表示這是一個(gè)容器圆存, 只有在容器中 ConfigurationProperties 才能使用
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean man;
private Date birth;
private Map<String,Object>map;
private List<Object>list ;
private Son son ;
.....省略get/set 以及toString 方法
}
package com.example.webservice.bean;
public class Son {
private String name;
private Integer age ;
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Son{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
properties文件綁定的寫法
#注釋方法 Ctrl + /
person.name=爸爸
person.age=45
person.man=true
person.birth=2019/8/8
person.map.k1=h1
person.map.k2=h2
person.list=a,1,son
person.son.name=兒子
person.son,age=20
yml 文件綁定的寫法:
person:
name: 爸爸
age: 25
birth: 2018/2/8
man: true
list:
- a
- 2
- son
map: {key1:value1,key2:value2}
son:
name: 兒子
age: 5測試類 : 在我們的test 文件夾下 :package com.example.webservice;import com.example.webservice.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)@SpringBootTestpublic class WebserviceApplicationTests { @Autowired Person person; @Test public void contextLoads() { // 直接運(yùn)行這個(gè)方法 ,而不是運(yùn)行整個(gè)程序 System.out.println(person); System.out.println("********************************************************"); }