外部配置
spring Boot允許使用properties文件、yaml文件或者命令行參數作爲外部配置
使用@Value註解,可以直接將屬性值注入到你的beans中,並通過Spring的Environment抽象或綁定到結構化對象來訪問。
以前使用Spring的時候需要通過@PropertySource指明properties文件位置,然後通過@value注入.
常規屬性配置
在properties文件中增加幾個屬性
-
server.port=8081
-
server.context-path=/demo
-
#聲明一個name屬性
-
user.name=張三
-
user.age=21
Java類
-
package com.ibigsea.bootdemo;
-
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.boot.SpringApplication;
-
import org.springframework.boot.autoconfigure.SpringBootApplication;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RestController;
-
-
-
-
-
@SpringBootApplication
-
@RestController
-
public class App {
-
-
@Value("${user.name}")
-
private String name;
-
-
@Value("${user.age}")
-
private Long age;
-
-
@RequestMapping("/")
-
public String index(){
-
return "Hello Spring Boot, name is " + name + ", age is "+ age;
-
}
-
-
public static void main(String[] args) {
-
-
-
-
SpringApplication.run(App.class, args);
-
}
-
}
運行結果:
除此之外,Spring Boot 還提供了基於類型安全的配置方式,通過@ConfigurationProperties將properties屬性和一個Bean及其屬性關聯,從而實現類型安全的配置
在上面的情景下新增一個UserSetting類
-
package com.ibigsea.bootdemo;
-
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.stereotype.Component;
-
-
@Component
-
-
-
@ConfigurationProperties(prefix = "user")
-
public class UserSetting {
-
private String name;
-
private Long age;
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public Long getAge() {
-
return age;
-
}
-
public void setAge(Long age) {
-
this.age = age;
-
}
-
}
使用
運行結果
日誌配置
Spring boot默認的輸出格式
-
2016-07-04 23:47:27.195 INFO 28916 --- [ main] com.ibigsea.bootlog.App : Starting App on sea-pc with PID 28916 (E:\workspace\myworkspace\bootlog\target\classes started by bigsea in E:\workspace\myworkspace\bootlog)
-
2016-07-04 23:47:27.201 INFO 28916 --- [ main] com.ibigsea.bootlog.App : No active profile set, falling back to default profiles: default
-
2016-07-04 23:47:27.315 INFO 28916 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@75592f8b: startup date [Mon Jul 04 23:47:27 CST 2016]; root of context hierarchy
-
2016-07-04 23:47:28.653 INFO 28916 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
-
2016-07-04 23:47:30.227 INFO 28916 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
-
2016-07-04 23:47:30.245 INFO 28916 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
-
2016-07-04 23:47:30.245 INFO 28916 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.30
-
2016-07-04 23:47:30.371 INFO 28916 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
- 時間日期 — 精確到毫秒
- 日誌級別 — ERROR, WARN, INFO, DEBUG or TRACE
- 進程ID
- 分隔符 — --- 標識實際日誌的開始
- 線程名 — 方括號括起來(可能會截斷控制檯輸出)
- Logger名 — 通常使用源代碼的類名
- 日誌內容
默認情況下ERROR, WARN和INFO級別的消息會輸出到控制檯
可以通過命令行開啓DEBUG或者在properties文件中添加
Properties文件中添加 debug=true 即可
如果想要輸出到日誌文件中,那麼需要在properties文件中設置logging.file或logging.path屬性
控制日誌級別
通過 logging.level.*= LEVEL(LEVEL是TRACE,DEBUG,INFO,WARN,FATAL,OFF)中的一個
這樣表示項目中所有的日誌級別都是一樣的.也可以精準控制到具體的一塊
-
logging.level.org.springframework.web: DEBUG //org.springframework.web包下面的日誌級別是DEBUG的
-
logging.level.org.hibernate: ERROR //org.hibernate包下面的日誌級別是ERROR
-
logging.level.com.ibigsea.*: INFO //com.ibigsea包下面的日誌級別是INFO
除了Spring Boot默認的以外,還可以激活其他各種日誌系統
由於日誌是在ApplicationContext被創建之前初始化,所以不可能在Spring的@Configuration文件中,通過系統屬性和傳統的外部配置文件依然可以讓日誌系統正常工作
這句話一直無法理解,查詢資料也大都是沒解釋清楚,猜想的話 應該是在pom裏面添加對應日誌依賴,然後在項目添加對應的配置文件比如這樣的
Spring boot 會自動激活這個日誌系統
Profile配置
Profile是Spring用來針對不同環境對不同配置提供支持的,全局Profile配置使用
application-{profile}.properties 如:application-prod.properties
在本地模擬出一個開發環境和生產環境
創建application-prd.properties 和 application-dev.properties
項目結構
application-dev.properties
application-prd.properties
application.properties
-
spring.profiles.active=prd
啓動結果
修改spring.profiles.active爲dev並啓動
除了上面這種配置方式,我們還有一種更簡便的方式來配置多種環境,通過命令行參數配置
刪除多餘的properties文件
application.yml
-
server :
-
port : 8081
-
---
-
spring :
-
profiles : dev
-
server :
-
port : 8082
默認是prd環境
在啓動的時候增加參數 spring.profiles.active=dev
右擊顯示菜單選擇run configurations
添加命令行參數
OK 實驗成功
將程序打包之後 通過 java -jar xx.jar --spring.profiles.active=dev的方式啓動