SpringBooot基本配置
Web容器基本配置
学习了SpringBoot框架之后,我们了解到SpringBoot内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat,这个在我们启动 Spring Boot 项目的时候,在控制台上就能看到,具体信息如下:
我们可以通过修改 pom.xml 来移除内嵌的 Tomcat 更换为其他的容器,比如更换为 Jetty 容器,配置如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 jetty 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
添加完毕之后,更新pom文件,编译项目,启动之后如下显示,代表更改成功。
容器配置application.properties
#禁止Web容器的使用,也可以指定web容器的使用
#spring.main.web-application-type=none
#容器基本配置
#指定端口号
#server.port=8888
#关闭所有的http端点
#server.port=-1
#随机端口
#server.port=0
#响应压缩
server.compression.enabled=true
获取Web容器端口号
@Component
public class MyAppliocationListener implements ApplicationListener<WebServerInitializedEvent> {
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
System.out.println(event.getWebServer().getPort());//打印获取到的随机端口
}
}
响应返回到浏览器数据进行压缩
测试看看,如下图:
没压缩前的的数据大小
添加配置后压缩大小
看响应头看到这个就是压缩了
Tomcat 日志配置
Tomcat 日志分为两种类型
- 访问日志:主要记录访问者的IP、时间等信息。
- 服务器内部日志:主要记录内部运行、异常等信息。
#定义日志生成目录
server.tomcat.basedir=tomcat-log
#开启访问日志
server.tomcat.accesslog.enabled=true
#定义日志前缀
server.tomcat.accesslog.prefix=demo-log
#定义日志后缀
server.tomcat.accesslog.suffix=.log
#定义日志日期格式
server.tomcat.accesslog.file-date-format=.yyyyMMdd
#定义日志内容格式
# %h 请求的客户端IP
# %l 用户身份
# %u 用户名
# %t 请求时间
# %r 请求地址
# %s 响应状态码
# %b 响应大小
server.tomcat.accesslog.pattern=%h %l %u %t \"%r"\ %s %b
#开启服务器内部日志
logging.level.org.apache.tomcat = debug;
logging.level.org.apache.catalina = debug;
访问日志:
服务器内部日志:
配置文件名称和路径
在Spring Boot 中,配置文件有两种不同的格式,一个是properties,另一个是yaml。
虽然 properties 文件比较常见,但是相对于properties而言,yaml更加简洁明了,而且使用的场景也更多,很多开源项目都是使用yaml进行配置(例如Hexo)。除了简洁,yaml还有另外一个特点
就
是yaml 中的数据是有序的,properties 中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要(例如我们在Spring Cloud Zuul中的配置),此时我们一般采用yaml。
本文主要来看看properties的问题。
位置问题
首先,当我们创建一个Spring Boot工程时,默认resources目录下就有一个application.properties文件,可以在application.properties文件中进行项目配置,但是这个文件并非唯一的配置文件,在Spring Boot中,一共有4个地方可以存放 application.properties文件。
1.当前项目根目录下的config目录下
2.当前项目的根目录下
3.resources目录下的config目录下
4.resources目录下
按如上顺序,四个配置文件的优先级依次降低。如下:
这四个位置是默认位置,即Spring Boot启动,默认会从这四个位置按顺序去查找相关属性并加载。但是,这也不是绝对的,我们也可以在项目启动时自定义配置文件位置。
例如,现在在resources目录下创建一个javaboy目录,目录中存放一个application.properties文件,那么正常情况下,当我们启动Spring Boot项目时,这个配置文件是不会被自动加载的。我们可以通过spring.config.location属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找application.properties文件。
此时启动项目,就会发现,项目以classpath:/javaboy/application. propertie配置文件启动。这是在开发工具中配置了启动位置,如果项目已经打包成jar,在启动命令中加入位置参数即可;
java -jar properties-o.0.1-SNAPSHOT.jar –
spring.config.location=classpath : /javaboy/
文件名问题
对于application.properties而言,它不一定非要叫application,但是项目默认是去加载名为
application的配置文件,如果我们的配置文件不叫application,也是可以的,但是,需要明确指定配置文件的文件名。
方式和指定路径一致,只不过此时的key是spring.config.name 。
首先我们在resources目录下创建一个app.properties文件,然后在IDEA中指定配置文件的文件名:
指定完配置文件名之后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为
app.properties 的配置文件。当然,允许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就需要明确指定spring.config.location 。
配置文件位置和文件名称可以同时自定义。
属性普通注入方式
普通的属性注入
由于Spring Boot 源自Spring,所以Spring 中存在的属性注入,在Spring Boot中一样也存在。
由于Spring Boot 中,默认会自动加载 application.properties文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,现在定义一个Book类:
public c1ass Book {
private Long id;
private string name;
private string author;
//省略getter/setter
然后,在application.properties文件中定义属性:
book.name=三国演义
book.author=罗贯中book.id=1
按照传统的方式(Spring中的方式),可以直接通过@Value注解将这些属性注入到Book对象中:
例如,现在定义一个Book类:
@component
public class Book {
@value("${book.id}")
private Long id;
@value("${book.name}")
private string name;
@value("${book.author}")
private string author;
//省略getter/setter
注意
Book对象本身也要交给Spring容器去管理,如果Book没有交给Spring容器,那么Book中的属性也无法从Spring容器中获取到值。
配置完成后,在Controller或者单元测试中注入Book对象,启动项目,就可以看到属性已经注入到对象中了。
一般来说,我们在application.properties文件中主要存放系统配置,这种自定义配置不建议放在该文件中,可以自定义properties 文件来存在自定义配置。
例如在resources目录下,自定义book.properties文件,内容如下:
book.name=三国演义
book.author=罗贯中
book.id=1
此时,项目启动并不会自动的加载该配置文件,如果是在XML配置中,可以通过如下方式引用该properties文件:
<context:property-p1aceholder location="classpath:book.properties"/>
如果是在Java 配置中,可以通过@PropertySource来引入配置:
@component
Propertysource("c1asspath:book.properties")public class Book {
@value("${book .id}")
private Long id;
@value("${book.name}")
private string name;
@value("$ {book.author}")
private string author;
//getter/setter
这样,当项目启动时,就会自动加载 book.properties文件。
这只是Spring 中属性注入的一个简单用法,和Spring Boot没有任何关系。
类型安全的属性注入
Spring Boot引入了类型安全的属性注入,如果采用Spring 中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。
使用类型安全的属性注入,可以有效的解决这个问题。
@component
@Propertysource("classpath: book.properties")
aconfigurationProperties(prefix = "book")
public class Book {
private Long id;
private string name;
private string author;
//省略getter/setter
}
这里,主要是引入@ConfigurationProperties(prefix = “book”)注解,并且配置了属性的前缀,此时会自动将Spring容器中对应的数据注入到对象对应的属性中,就不用通过@Value注解挨个注入了,减少工作量并且避免出错。