Spring Boot - 静态资源处理、启动加载、日志处理
回顾
我们通过启动日志,可以发现,spring boot 默认提供了静态资源处理。接下来,我们了解下,该如何应用默认配置,如何自定义静态资源处理。
INFO o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
INFO o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
INFO o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
静态资源处理
建议大家使用Spring Boot的默认配置方式,如果需要特殊处理的再通过配置进行修改。本文主要讲解Spring Boot的默认处理方式
默认资源映射
- 其中默认配置的 /** 映射到 /static (或/public、/resources、/META-INF/resources)
- 优先级顺序为:META-INF/resources > resources > static > public
- 目录结构:
自定义资源映射
上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录?
-
增加 /2017imgs/ 映射到 classpath:/2017imgs/
- 实现类Config继承 WebMvcConfigurerAdapter 并重写方法 addResourceHandlers
- 在resources目录下,增加2017imgs文件夹
package com.wanye;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* Created by wanye on 2017/6/3.
*/
@Configuration
public class Config extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/2017imgs/**").addResourceLocations("classpath:/2017imgs/");
}
}
- 访问2017imgs文件夹中的demo.jpg 图片的地址为 http://localhost:8080/2017img...
- 实际工作中,我们自己处理静态资源的情况是非常少的,静态资源大多数情况,都被放在单独的静态资源服务器,并且通过cdn来加速访问。
配置特殊的扩展名
2017-06-15追加
看到Springboot 配置*.do请求这样一个问题,作答如下
先说一下思路:
1.dispatcherServlet会接管所有请求(包括静态资源请求),如果修改默认的UrlMapping为*.do,那么一定会导致静态资源无法加载。
2.仔细思考一下题主的的场景,目的希望所有*.do(扩展名)的请求,映射到controller中的method上。(对吗?)
3.那么问题就简单了,参考@RequestMapping所使用的规则
* <p>The mapping matches URLs using the following rules:<br>
* <ul>
* <li>{@code ?} matches one character</li>
* <li>{@code *} matches zero or more characters</li>
* <li>{@code **} matches zero or more <em>directories</em> in a path</li>
* <li>{@code {spring:[a-z]+}} matches the regexp {@code [a-z]+} as a path variable named "spring"</li>
* </ul>
将映射规则调整为
/**
* Created by wanye on 2017/5/20.
*/
@RestController // @Controller + @ResponseBody
@RequestMapping("**.do")
public class HelloController {
@RequestMapping(name = "hello")
public Map<String, String> hello(){
Map<String, String> hello = new HashMap<String, String>();
hello.put("data", "hello 小红");
hello.put("status", "SUCCESS");
return hello;
}
}
当然这只是一个例子,题主可以将@RequestMapping("**.do")配置抽象到基类中。
启动加载
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。例如:白名单初始化、缓存加载、消息通知等等。为了解决这样的问题,Spring Boot 为我们提供了一个方法,只需要我们创建类,并实现接口CommandLineRunner,当然这个类需要被spring扫描到(不要忘了增加注解)
package com.wanye;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
/**
* Created by wanye on 2017/6/3.
*/
@Component
@Order(1)
public class CacheInit implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println(">>cache init<<");
}
}
当有多个启动加载的类,可以通过@Order来指定加载顺序,按value值从小到大顺序来执行。Spring Boot会将启动参数传给自定义启动加载的类中run方法。
日志处理
Spring Boot在所有内部日志中使用Apache Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。本文,主要讲解自定义日志配置,并以logback为例进行演示。
自定义配置
由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根据不同的日志组件,按如下规则给文件命名,就能被正确加载:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml)
logback
在resources下增加logback.xml配置
<configuration debug="false" scan="true" scanPeriod="30 seconds">
<property name="FILE_PATTERN" value="%d [%t] %5p %c - %m%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%t] %5p %logger - %m%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>hello.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>hello.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
简单说明logback配置文件中的常用配置
-
控制台输出ConsoleAppender
- 在开发过程中最常用的是将日志输出到控制台
-
文件输出RollingFileAppender
- 另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志.
- 其中重要的是rollingPolicy的定义,上例中hello.%d{yyyy-MM-dd}.log定义了日志的切分方式——把每一天的日志归档到一个文件中,30表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。
总结
-
静态资源处理
- 默认资源映射(/** - > /resources/static) ,重点是默认目录的优先级
- ⾃定义资源映射 (继承WebMvcConfigurerAdapter 并重写方法addResourceHandlers)
-
启动加载
- CommandLineRunner (实现接⼝,多个类加载的优先级)
-
日志处理
- logback(配置,控制台输出,文件输出)
最后
如果觉得我的文章对您有用,请点赞、收藏。您的支持将鼓励我继续创作!视频课程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。