Spring Boot - 静态资源处理、启动加载、日志处理

Spring Boot - 静态资源处理、启动加载、日志处理

回顾

  1. Spring Boot-初识 Hello World
  2. Spring Boot - Servlet、过滤器、监听器、拦截器

咱们经过启动日志,能够发现,spring boot 默认提供了静态资源处理。接下来,咱们了解下,该如何应用默认配置,如何自定义静态资源处理。web

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的默认处理方式spring

默认资源映射

  • 其中默认配置的 /** 映射到 /static (或/public、/resources、/META-INF/resources)
  • 优先级顺序为:META-INF/resources > resources > static > public
  • 目录结构:图片描述

自定义资源映射

上面咱们介绍了Spring Boot 的默认资源映射,通常够用了,那咱们如何自定义目录?segmentfault

  1. 增长 /2017imgs/ 映射到 classpath:/2017imgs/缓存

    1. 实现类Config继承 WebMvcConfigurerAdapter 并重写方法 addResourceHandlers
    2. 在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/");
    }
}
  1. 访问2017imgs文件夹中的demo.jpg 图片的地址为 http://localhost:8080/2017img...
  2. 实际工做中,咱们本身处理静态资源的状况是很是少的,静态资源大多数状况,都被放在单独的静态资源服务器,而且经过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>

将映射规则调整为app

/**
 * 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")配置抽象到基类中。ide

启动加载

实际应用中,咱们会有在项目服务启动的时候就去加载一些数据或作一些事情这样的需求。例如:白名单初始化、缓存加载、消息通知等等。为了解决这样的问题,Spring Boot 为咱们提供了一个方法,只须要咱们建立类,并实现接口CommandLineRunner,固然这个类须要被spring扫描到(不要忘了增长注解)spa

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方法。debug

日志处理

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配置文件中的经常使用配置
  1. 控制台输出ConsoleAppender

    1. 在开发过程当中最经常使用的是将日志输出到控制台
  2. 文件输出RollingFileAppender

    1. 另外一种常见的日志输出到文件,随着应用的运行时间愈来愈长,日志也会增加的愈来愈多,将他们输出到同一个文件并不是一个好办法。RollingFileAppender用于切分文件日志.
    2. 其中重要的是rollingPolicy的定义,上例中hello.%d{yyyy-MM-dd}.log定义了日志的切分方式——把每一天的日志归档到一个文件中,30表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。

总结

  1. 静态资源处理

    1. 默认资源映射(/** - > /resources/static) ,重点是默认目录的优先级
    2. ⾃定义资源映射 (继承WebMvcConfigurerAdapter 并重写方法addResourceHandlers)
  2. 启动加载

    1. CommandLineRunner (实现接⼝,多个类加载的优先级)
  3. 日志处理

    1. logback(配置,控制台输出,文件输出)

最后

若是以为个人文章对您有用,请点赞、收藏。您的支持将鼓励我继续创做!视频课程

相关文章
相关标签/搜索