SpringBoot(2)

2019-08-22  本文已影响0人  viankoo

1. SpringBoot的日志系统

Spring Boot 使用 Commons Logging 记录所有内部日志,但开放日志的底层实现。其为 Java Util LoggingLog4J2Logback 提供了默认配置。

1.1. 文件输出

默认情况下,SpringBoot的日志只输出到控制台,如果还想写入到日志文件,需要设置logging.filelogging.path 属性。

logging.file logging.path 示例 描述
(无) (无) 仅在控制台输出
指定文件 (无) my.log 写入指定的日志文件。名称可以是绝对位置或相对于当前目录。
(无) 指定目录 /var/log 将 spring.log 写入指定的目录。名称可以是绝对位置或相对于当前目录。

日志文件在达到 10MB 时会轮转,并且与控制台输出一样,默认情况下会记录 ERROR、WARN 和 INFO 级别的内容。可以使用 logging.file.max-size 属性更改大小限制。除非已设置 logging.file.max-history 属性,否则以前轮转的文件将无限期归档

1.2. 日志等级

logging.level.<logger-name>=<level> 来设置 Spring Environment 中的记录器等级。其中 level 是 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 和 OFF 其中之一。
下面是application.yml中日志记录设置:

logging:
  level:
    root: info
    org.springframework.web: debug
    com.viankoo.test: info
    com.viankoo.test.service: debug

1.3. 日志组

Spring Boot 允许您在 Spring Environment 中定义日志记录组。例如,以下通过将 tomcat 组添加到 application.properties 来定义 tomcat 组:

logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat

定义后,您可以使用一行配置来更改组中所有记录器的级别:

logging.level.tomcat=TRACE

Spring Boot 包含以下预定义的日志记录组,可以直接使用:

名称 日志记录器
web org.springframework.core.codecorg.springframework.httporg.springframework.web
sql org.springframework.jdbc.coreorg.hibernate.SQL

1.4. 自定义日志配置

org.springframework.boot.logging.LoggingSystem 系统属性强制 Spring Boot 使用特定的日志记录系统。该值应该是一个实现了 LoggingSystem 的类的完全限定类名。您还可以使用 none 值完全禁用 Spring Boot 的日志记录配置。
根据不同日志系统加载对应文件:

日志记录系统 文件
Logback logback-spring.xmllogback-spring.groovylogback.xml 或者 logback.groovy
Log4j2 log4j2-spring.xml 或者 log4j2.xml
JDK(Java Util Logging) logging.properties

注意

1、由于日志记录在创建 ApplicationContext 之前初始化,因此更改日志记录系统或完全禁用它的唯一方法是通过系统属性设置。
2、建议您使用 -spring 的形式来配置日志记录(比如 logback-spring.xml 而不是 logback.xml),否则Spring不能完全控制日志初始化。
3、避免使用Java Util Logging记录日志,在运行可执行jar时,存在已知类加载问题。

1.5. Logback扩展

Spring Boot 包含许多 Logback 扩展,可用于进行高级配置。您可以在 logback-spring.xml 配置文件中使用这些扩展。
注意

1、由于标准的 logback.xml 配置文件加载过早,因此无法在其中使用扩展。您需要使用 logback-spring.xml 或定义 logging.config 属性。
2、扩展不能与 Logback 的配置扫描一起使用。

实例:



2. SpringMVC的配置

2.1. HttpMessageConverters

HttpMessageConverter 接口来转换 HTTP 的请求和响应,Spring Boot提供了合适的默认值,如:对象可以自动转换为 JSON(使用 Jackson 库)或者 XML(优先使用 Jackson XML 扩展,其次为 JAXB)。字符串默认使用 UTF-8 编码。
自定义转换器(converter),可以使用 Spring Boot 的 HttpMessageConverters 类:

@Configuration
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}

2.2. 自定义 JSON Serializer 和 Deserializer

自定义序列化器(serializer)的做法通常是通过@JsonComponent 注解,直接注册Spring Bean。您可以通过@JsonComponent注册两个序列化和反序列化的Bean,或者通过一个内部类的形式实现。例如:

@JsonComponent
public class Example {

    public static class Serializer extends JsonSerializer<SomeObject> {
        // ...
    }

    public static class Deserializer extends JsonDeserializer<SomeObject> {
        // ...
    }

}

2.3. ConfigurableWebBindingInitializer

Spring MVC 使用一个 WebBindingInitializer 为特定的请求初始化 WebDataBinder。如果您创建了自己的 ConfigurableWebBindingInitializer @Bean,Spring Boot 将自动配置 Spring MVC 使用它。

2.4. 全局错误处理

推荐的一种方式,定义一个带有 @ControllerAdvice 注解的类来自定义为特定控制器或异常类型返回的 JSON 文档:

@ControllerAdvice(annotations = RestController.class)
public class RestExceptionHandler {

    /**
     * 捕捉业务异常
     *
     * @param ex
     * @param req
     * @return
     */
    @ExceptionHandler(value = {BusinessException.class})
    @ResponseBody
    public Object handleSysIllegalArgumentException(BusinessException ex, WebRequest req) {
        return JsonResult.errorsInfo("3",ex.getMessage());
    }

    /**
     * 验证异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(AuthException.class)
    @ResponseBody
    public Object handleAuthException(Exception ex) {
        return JsonResult.errorsInfo("2", ex.getMessage());
    }

    /**
     * 捕捉系统异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleException(Exception ex) {
        return JsonResult.errorsInfo("1", ex.getMessage());
    }
}

2.5.CORS支持

跨域资源共享(Cross-origin resource sharing,CORS)是大多数浏览器实现的一个 W3C 规范,其可允许您以灵活的方式指定何种跨域请求可以被授权。
您可在 Spring Boot 应用程序中使用 @CrossOrigin 注解配置[控制器方法启用 CORS。还可以通过注册一个 WebMvcConfigurer bean 并自定义 addCorsMappings(CorsRegistry) 方法来定义全局 CORS 配置:

@Configuration
public class CorsConfiguration {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedHeaders("*")
                        .allowedMethods("*")
                        .allowedOrigins("*");
            }
        };
    }
}

3. Spring WebFlux 框架

Spring WebFlux 是 Spring Framework 5.0 中新引入的一个响应式 Web 框架。与 Spring MVC 不同,它不拘泥与servlet容器完全异步且无阻塞
Spring WebFlux 有两个版本:函数式和基于注解。基于注解的方式非常接近 Spring MVC 模型,如下所示:

@RestController
@RequestMapping("/users")
public class MyRestController {

    @GetMapping("/{user}")
    public Mono<User> getUser(@PathVariable Long user) {
        // ...
    }

    @GetMapping("/{user}/customers")
    public Flux<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
    }

    @DeleteMapping("/{user}")
    public Mono<User> deleteUser(@PathVariable Long user) {
        // ...
    }
}

函数式编程,它将路由配置与请求处理分开,如下所示:

@Configuration
public class RoutingConfiguration {

    @Bean
    public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
        return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
                .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
                .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
    }

}

@Component
public class UserHandler {

    public Mono<ServerResponse> getUser(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> deleteUser(ServerRequest request) {
        // ...
    }
}

详细信息可查看其参考文档

4. 集成数据源

5. 集成NoSQL技术

5.1. Redis

Redis 是一个集缓存、消息代理和键值存储等丰富功能的数据库。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
使用 spring-boot-starter-data-redisspring-boot-starter-data-redis-reactive starter 可方便地引入相关依赖。Spring Boot 为 LettuceJedis 客户端类库提供了基本自动配置,默认使用Lettuce。
第一步,引入依赖。

<!-- Redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

第二步,配置Redis。

spring:
  redis:
    database: 1
    host: 127.0.0.1
    port: 6379
    lettuce:
      pool:
        max-idle: 100
        max-active: 2000
        max-wait: 500

第三步,封装。

@Component
public class RedisUtils {

    @Autowired
    private StringRedisTemplate template;
    
    private String get(String key) {
        return template.opsForValue().get(key);
    }
    
    private void set(String key, String value) {
        template.opsForValue().set(key, value);
    }
}

5.2. Mongodb

MongoDB 是一个开源的 NoSQL 文档数据库,其使用了类似 JSON 的模式(schema)来替代传统基于表的关系数据。使用 pring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive starter 可方便地引入相关依赖。
第一步,引入依赖。

<!-- Mongodb -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

第二步,配置。

spring.
  data:
    mongodb:
      uri: mongodb://app_bill_rw:9240^XB4r82qd@10.139.60.166:27017,10.139.60.167:27017,10.139.60.168:27017/bill?replicaSet=rskkd

第三步,实现。
继承 MongoRepository <T,ID>接口,实现。

5.2.1. 内嵌Mongodb

Spring Boot 提供了内嵌 Mongo 的自动配置。要在 Spring Boot 应用程序中使用它,请添加依赖 de.flapdoodle.embed:de.flapdoodle.embed.mongo

可以使用 spring.data.mongodb.port 属性来配置 Mongo 的监听端口。如果想随机分配空闲端口,请把值设置为 0。MongoAutoConfiguration 创建的 MongoClient 将自动配置随机分配的端口。

注意

如果您不配置一个自定义端口,内嵌支持将默认使用一个随机端口(而不是 27017)。

如果您的 classpath 上有 SLF4J,Mongo 产生的输出将自动路由到名为 org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo 的 logger。

您可以声明自己的 IMongodConfigIRuntimeConfig bean 来控制 Mongo 实例的配置和日志路由。

上一篇下一篇

猜你喜欢

热点阅读