SpringBoot(2)
1. SpringBoot的日志系统
Spring Boot 使用 Commons Logging 记录所有内部日志,但开放日志的底层实现。其为 Java Util Logging、Log4J2 和 Logback 提供了默认配置。
1.1. 文件输出
默认情况下,SpringBoot的日志只输出到控制台,如果还想写入到日志文件,需要设置logging.file
或 logging.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.codec 、org.springframework.http 、org.springframework.web
|
sql |
org.springframework.jdbc.core 、org.hibernate.SQL
|
1.4. 自定义日志配置
org.springframework.boot.logging.LoggingSystem
系统属性强制 Spring Boot 使用特定的日志记录系统。该值应该是一个实现了 LoggingSystem
的类的完全限定类名。您还可以使用 none
值完全禁用 Spring Boot 的日志记录配置。
根据不同日志系统加载对应文件:
日志记录系统 | 文件 |
---|---|
Logback |
logback-spring.xml 、logback-spring.groovy 、logback.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-redis
或 spring-boot-starter-data-redis-reactive
starter 可方便地引入相关依赖。Spring Boot 为 Lettuce 和 Jedis 客户端类库提供了基本自动配置,默认使用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-mongodb
或spring-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。
您可以声明自己的 IMongodConfig
和 IRuntimeConfig
bean 来控制 Mongo 实例的配置和日志路由。