外部配置
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;
- /**
- * 是 Spring Boot 项目的核心注解, 主要是开启自动配置
- */
- @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
- @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 App = new SpringApplication(App.class);
- // App.setBannerMode(Mode.OFF);
- // App.run(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
- // 通过该注解价值 properties 文件内的配置
- // 通过 prefix 执行 properties 配置的前缀
- @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[email protected]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 文件中添加
Jar -jar xx.jar --debug
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
- server.port=8081
- application-prd.properties
- server.port=8082
- application.properties
- spring.profiles.active=prd
启动结果
修改 spring.profiles.active 为 dev 并启动
除了上面这种配置方式, 我们还有一种更简便的方式来配置多种环境, 通过命令行参数配置
删除多余的 properties 文件
application.YAML
- 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 的方式启动
---------------------
来源: http://www.bubuko.com/infodetail-3038295.html