Spring Boot 2 精髓学习笔记(六)---配置 Spring Boot

在Spring Boot 出现之前, Spring 项目会存在多个配置文件,比如web.xml ,配置Spring 的多个application-xxx.xml, xxx 代表配置Spring 的某一个功能,如application-datasource.xml 、application-mvc. xml 。应用自身也需要多个配置文件,还需要编写代码去读取这些配置文件的参数。现在Spring Boot 简化了Spring 配置的管理和读取,只需要一个application.properties , 并提供了多种读取配置文件的方式

一、配置Spring Boot

​ Spring Boot 默认启动的是8080 端白, Web 上下文是“/”,可以通过配置application.properties
来重新配置Spring Boot 。

1、 服务器配置

如果想更换其他端口,需要配置属性,比如在application.properties 中输入如下代码:

server.port=9090

也可以在命令行中指定启动端口,比如传入参数一server. port=9000:

java -jar bootsample.jar -- server.port=9000

或者传入虚拟机系统属性:

java -Dserver.port=9000 -jar bootsample.jar

以上三种方式都可以指定Web 监听端口, Spring Boot 的所有配置属性也都支持这三种方式,一般而言,传入虚拟机系统属性较为适用。在一台机器上部署多份Spring Boot 应用有很多好处,比如,提升系统吞吐量和性能,防止误操作关掉某一台应用,或者是在应用升级的时候,可以逐个升级而不影响系统服务。为了实现这个功能,只需要配置不同的监听端口就可以了。

Spring Boot 默认为应用配置的上下文访问目录是“/”,可以通过配置文件或者命令行,配置

server.context-path:=/config

常用的服务器配置的属性如下表所示:

属性 说明
server.address 服务器绑定地址,如果你的主机上有多个网卡,可以绑定一个IP 地址
server.session.timeout 会话过期时间,以秒为单位
server.error.path 服务器出错后的处理路径/error
server.servlet contextpath Spring Boot 应用的上下文
server. port Spring Boot 应用监听端口

详细配置可以参考这篇文章:

https://blog.csdn.net/liaokailin/article/details/48948093

2、 其他服务器配置

Spring Boot 内置了Tomcat ,同时还支持Jetty、Undertow 作为Web 服务器。使用这些应用服务器, 只需要引入相应的starter 。

替换为undertow:

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-undertow</artifactId>
		</dependency>

替换为jetty:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

server.tomcat. *包含了Tomcat 的相关配置,较为重要的配置如下:

#打开Tomcat 访问日志
server.tomcat.accesslog.enabled=false
#访问日志所在的目录
server.tomcat.accesslog.directory=logs
#允许HTTP 请求缓存到请求队列的最大个数,默认不限制
server.tomcat.accept-count=
#最大连接数,默认不限制,如果一旦连接数到达,剩下的连接将会保存到请求缓存队列里,也就
是accept-count 指定队列
server.tomcat.max-connections=
#最大工作线程数
server.tomcat.max-threads=
#HTTP POST 内容最大长度,默认不限制
server.tomcat.max-http-post-size

server.undertow. *包含了undertow 相关配置,较为重要的配置如下:

#打开undertow 日志,默认为false
server.undertow.accesslog.enabled=false
#访问日志所在目录
server.undertow.accesslog.dir=logs
#创建工作线程的I/O线程,默认为2 或者CPU 的个数
server.undertow.io-threads=
#工作线程个数,默认为I/O 线程个数的8 倍
server.undertow.worker-threads=
# HTTP POST 内容最大长度,默认不限制
server.undertow.max-http-post-size=O

sever.jetty. *包含了Jetty 相关配置,较为重要的配置如下:

#打开Jetty日志,默认为false
server.jetty.accesslog.enabled=false
#访问日志所在目录
server.jetty.accesslog.dir=logs
# acceptors 线程个数,用来接受访问请求,相当于工作线程
server.jetty.acceptors=
# selectors 线程个数,和CPU 个数相关,默认是可用( CPU+l)/2,用于分配请求给工作线程
server.jetty.selectors=

3、 配置启动信息

Spring Boot 启动的欢迎信息也可以进行配置,默认启动后,控制台打印“ Spring ” :

[外链图片转存失败(img-GDLR70Yo-1569243225050)(C:\Users\wangxf\AppData\Roaming\Typora\typora-user-images\1569238250581.png)]

可以在classpath 中增加banner.txt , 显示你自己的输出信息,在Spring Boot 项目的resources目录下新建一个banner.txt ,内容如下:

######Hello , Config Springboot

再次运行Spring Boot , 会发现启动信息己经改变。

也可以设置banner.gif(png、jpg),控制台自动将图片转为ASCII 字符,作为启动信息输出,比如公司的Logo ,将图片复制到resources 目录下即可。

banner.charset=UTF-8   # banner.txt 字符集
banner.image.location=classpath:banner.jpg   # 还可以是gif | png
banner.image.width= 76 #图片宽度,这里指转为字符的个数,越多越清楚
banner.image.height=76 #图片长度
banner.image.margin= 2 #图片与左边的边距,默认为2 个字符

配置浏览器显示ico:

Spring Boot 的webapp 启动后,通过浏览器访问,浏览器上会显示一个绿色的树叶的图标,那是Spring Boot 的官方Logo 。如果需要更换成自己的图标,在项目的resources 目录下新建一个static 目录,在sta tic 目录下创建images 目录(或者任意放置图片的目录),然后将项目的favicon.ico 放在images 目录下,每个页面添加以下样式即可:

< link rel="shortcut icon"  href ="/images/apple.ico">

二、日志配置

默认情况下,不需要对日志做任何配置就可以使用, Spring Boot 使用LogBack 作为日志的
实现,使用apache Commons Logging 作为日志接口,因此代码中通常是这样的:

public class HelloworldController {
private Log log = LogFactory.getLog(HelloworldController.class) ;
...
}

日志、格式类似这样:

2017-03-14 17:10:40.253 INFO 6396 --- [ restartedMain]
com. coamc.starter.CosonleApplication Starting
2017-03-14 17:10:40.255 INFO 6396 --- [ restartedMain]
com.coamc.starter.CosonleApplication   :No active profile set, .....

日志每行内容的格式如下:

  • 日期和时间:
  • 日志级别,有ERROR、WARN 、INFO 、DEBUG 和TRACE;
  • 进程id, Spring Boot 应用的进程id;
  • —, 分隔符号,后面是日志消息:
  • [xxx], 线程的名称:
  • 类名;
  • 消息体。

默认情况下, INFO 级别以上的信息才会打印到控制台,可以自己设定日志输出级别,比如
在application.properties 中加入以下代码:

logging.level.root=info
#org 包下的日志级别
logging.level.org=warn
logging.level.com.yourcorp=debug

指定默认的级别是INFO ,但包名是org 开头的类,日志级别是WARN. org 包名的类大多是第三方依赖库,有时候没有必要显示INFO级别, com.yourcorp开头的类使用debug。

Spring Boot 默认井未输出日志到文件,可以在application.properties 中指定日志输出:

logging.file = my.log

日志输出到my.log 中,位于Spring Boot 应用运行的当前目录,比如项目工程目录下,也可以指定日志存放的路径,使用:

logging.path=e:/temp/log

这样,会默认在e:/temp/log 下生成一个叫spring.log 的日志文件。

无论用哪种方式记录日志文件,当日志文件到达lOMB 的时候,会自动重新生成一个新日志文件。

Spring Boot 支持对控制台日志输出和文件输出进行格式控制,代码如下(仅使用内置的logback ) :

logging.pattern.console =%level %date{HH:mm:ss}%logger{20}.M%L:%m%n
logging.pattern.file=%level %date{ISO8601}%logger{20}.M%L:%m%n
  • %level , 表示输出日志级别。
  • %date ,表示日志发生时的时间, HH:mm:“输出时分秒,比较合适用于控制台查看,
    IS08601 则是标准日期输出,相当于yyyy-MM-dd HH:mm:ss.SSS 。
  • %logger , 用于输出Logger 的名字,包名+类名,{ n}限定了输出长度,如果输出长度
    不够,尽可能显示类名、压缩包名。
  • %thread,当前线程名。
  • %M ,日志发生时的方法名字。
  • %L,日志调用所在代码行,线上运行时不建议使用此参数,因为获取代码行对性能有
    消耗。
  • %m ,日志、消息。
  • %n,日志换行。

Spring Boot 支持多种日志框架,如Log4J2 、Log back 、Java Util Logging 等,但建议使
用内置的Log back 即可。
也可以通过在resources 目录下使用logback . xml 或者logback-spring. xml 来对Log back
进行更详细的配置。

我们可以通过命令行的方式来改变日志配置,也可以通过Actuator 功能在运行时动态改变日志配置,关于Actuator,在后面会专门讲述。以下是通过参数一debug 将系统日志级别调整为debug 方式。

java -jar myapp.jar -debug

或者传入一个特定的日志配置:

java -jar myapp.jar --logging.level.com.bee.sample=error

三、读取应用配置

可以在应用中读取application.properties 文件, Spri ng Boot 提供了三种方式,通用的Enviroment 类,可以通过key-value 方式获取到application.properties 中的值,也可以通过@Value注解,自动注入属性值,还可以将一组属性自动注入到一个配置类中。

1、Environment

Environment 是一个通用的读取应用程序运行时的环境变量的类,可以读取application .properties 、命令行输入参数、系统属性、操作系统环境变量等。可以通过Spring 容器自动注入,比如在Spring 管理的Bean 中:

@Configuration
public class EnvConfig {
@Autowired private Environment env;
  public int getServerPort() {
   return env.getProperty ("server.port",Integer.class);
   }
}

下表是一些读取的例子。

读取 返回值
env.getProperty(“user.dir”) 程序运行的目录,如果在IDE 中运行, 就是工程目录, u ser.dir是系统属性
env.getProperty(“user.home”) 执行程序的用户的home 目录, user. home 是系统属性
env.getProperty(“JAVA_HOME”) 读取设置的环境变量(不区分大小写)
env.getProperty(“server.port”) 读取server.port , 来自application .properties

Environment 是Sprin g Boot 最早初始化的一个类,因此可以用在Spring 应用的任何地方。

2、@value

直接通过@Value 注解注入一个配置信息到Spring 管理的Bean 中:

@RequestMapping ("/showvalue.html")
public @ResponseBody String value (@Value ("${server.port}") int port) {
return "port:"+port ;
}

@Value 并不能在任何S pring 管理的Bean 中使用,因为@Value 本身是通过AutowiredAnnotat ion BeanPostProcessor 实现的,它是BeanPostProcessor 接口的实现类,因此任何BeanPostProcessor 和BeanFactoryPostProcessor 的子类中都不能使用@Va lu e来注入属性,因为那时候@Value 还没有被处理。

@Va lue 注解支持Sp EL 表达式,如果属性不存在,可以为其提供一个默认值:

@Value (”${ cache.enable:false } ”)
private boolean isCache ;

3、@ConfigurationProperties

通常情况下,将一组同样类型的配置属性映射为一个类更为方便,比如服务器配置,在application . properties 中写成如下配置:

server.port=9090
server.context-path=/config

以上三个配置属性都与Web 服务器配置相关,都有server 前缀,因此可以使用注解@ConfigurationProperties 来获取这一组实现,代码如下:

@ConfigurationProperties ("server")
@Configuration
public class ServerConfig {
   private int port;
   private String contextPath;
  
   public int getPort() {
      return port;
    }    
   public void setPort(int port) {
   this.port=port;
   }
   public String getContextPath () {
    return contextPath;
   }    
   public void setContextPath(String contextPath) {
   this.contextPath = contextPath;
   }
}

在处理· configurationProperties 注解的类的时候,自动会将“-”或者’二”去掉,转化为Java命名规范,如将context-path 转为contextPath 。

ConfigurationProperties和@value 的功能差不多,建议使用ConfigurationProperties,因为它能将一组属性统一管理。@ Value 的优点是支持SpEL 表达式,但Sp EL 表达式是把双刃剑,不容易调试和重构。

(本节结束)

发布了40 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LUCKWXF/article/details/101225045