文章摘要(AI生成)
5.国际化Spring Boot 支持本地化消息,以便您的应用程序可以满足不同语言偏好的用户。默认情况下,Spring Bootmessages在类路径的根目录中查找资源包的存在。当配置的资源包的默认属性文件可用时(messages.properties默认情况下),自动配置适用。如果您的资源包仅包
5.国际化
Spring Boot 支持本地化消息,以便您的应用程序可以满足不同语言偏好的用户。默认情况下,Spring Boot在类路径的根目录中查找messages
资源包的存在。
当配置的资源包的默认属性文件可用时(默认情况下为messages.properties
),自动配置适用。如果您的资源包仅包含特定于语言的属性文件,则需要添加默认值。如果没有找到与任何配置的基本名称匹配的属性文件,则不会有自动配置的 MessageSource
。
可以使用spring.messages
命名空间配置资源包的基本名称以及其他几个属性,如下例所示:
spring.messages.basename=messages,config.i18n.messages
spring.messages.fallback-to-system-locale=false
spring.messages.basename
支持以逗号分隔的位置列表,可以是包限定符,也可以是从类路径根解析的资源。
更多支持选项,请参阅MessageSourceProperties
。
6.JSON
Spring Boot 提供与三个 JSON 映射库的集成:
- gson
- Jackson
- JSON-B
Jackson 是首选的默认库。
6.1. Jackson
提供了 Jackson 的自动配置,并且 Jackson 是spring-boot-starter-json
. 当 Jackson 在类路径上时,ObjectMapper
会自动配置一个 bean。提供了几个配置属性用于自定义ObjectMapper
.
6.1.1. 自定义序列化器和反序列化器
如果您使用 Jackson 来序列化和反序列化 JSON 数据,您可能需要编写自己的JsonSerializer
类和JsonDeserializer
类。自定义序列化程序通常通过模块向 Jackson 注册,但 Spring Boot 提供了一个@JsonComponent
注解,可以更轻松地直接注册 Spring Bean。
您可以直接在JsonSerializer
JsonDeserializer
或KeyDeserializer
实现上使用@JsonComponent
注释。您还可以在包含序列化器/反序列化器作为内部类的类上使用它,如以下示例所示:
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
jgen.writeEndObject();
}
}
public static class Deserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode tree = codec.readTree(jsonParser);
String name = tree.get("name").textValue();
int age = tree.get("age").intValue();
return new MyObject(name, age);
}
}
}
ApplicationContext
中的所有@JsonComponent
bean 都会自动向 Jackson 注册。因为@JsonComponent
是用元注解的@Component
,所以通常的组件扫描规则适用。
Spring Boot 还提供了JsonObjectSerializer
和JsonObjectDeserializer
基类,它们在序列化对象时提供了标准 Jackson 版本的有用替代方案。有关详细信息,请参阅JsonObjectSerializer
和JsonObjectDeserializer
的Javadoc。
上面的例子可以重写为使用JsonObjectSerializer
/JsonObjectDeserializer
如下:
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonObjectSerializer<MyObject> {
@Override
protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
}
}
public static class Deserializer extends JsonObjectDeserializer<MyObject> {
@Override
protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
JsonNode tree) throws IOException {
String name = nullSafeValue(tree.get("name"), String.class);
int age = nullSafeValue(tree.get("age"), Integer.class);
return new MyObject(name, age);
}
}
}
6.1.2. 混合
Jackson 支持 mixins,可用于将其他注解混合到已在目标类上声明的注释中。Spring Boot 的 Jackson 自动配置将扫描您应用程序的包以查找带有@JsonMixin
注解的类,并将它们注册到自动配置的ObjectMapper
中。通过 Spring Boot 的JsonMixinModule
注册.
6.2. gson
提供了 Gson 的自动配置。当 Gson 在类路径上时,会自动配置一个Gson
bean。提供了几个spring.gson.*
配置属性用于自定义配置。要进行更多控制,可以使用一个或多个GsonBuilderCustomizer
bean。
6.3. JSON-B
提供了 JSON-B 的自动配置。当 JSON-B API 和实现在类路径上时,将自动配置一个Jsonb
bean。首选的 JSON-B 实现是为其提供依赖管理的 Apache Johnzon。
7. 任务执行与调度
在上下文中没有Executor
bean 的情况下,Spring Boot 自动配置一个具有合理的默认值的ThreadPoolTaskExecutor
,这些默认值可以自动关联到异步任务执行 ( @EnableAsync
) 和 Spring MVC 异步请求处理。
如果您在上下文中定义了自定义Executor
,则常规任务执行(即@EnableAsync
)将透明地使用它,但配置不会支持 Spring MVC ,因为它需要对AsyncTaskExecutor
进行实现(名为applicationTaskExecutor
)。根据您的目标安排,您可以将您的Executor
更改为 ThreadPoolTaskExecutor
或定义 ThreadPoolTaskExecutor
和AsyncConfigurer
包装自定义的Executor
。自动配置TaskExecutorBuilder
允许您轻松创建实例来重现自动配置默认执行的操作。
线程池使用8个核心线程,可以根据负载增长和收缩。这些默认设置可以使用命名空间进行微调spring.task.execution
,如以下示例所示:
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
这将线程池更改为使用有界队列,以便当队列已满(100 个任务)时,线程池增加到最多 16 个线程。由于线程在空闲 10 秒(而不是默认情况下为 60 秒)时被回收,因此池的收缩更具侵略性。
如果需要与计划的任务执行相关联(例如使用@EnableScheduling
),也可以自动配置ThreadPoolTaskScheduler
。线程池默认使用一个线程,可以使用命名空间spring.task.scheduling
微调其设置,如下例所示:
spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
如果需要创建自定义执行程序或调度程序,则TaskExecutorBuilder
bean 和TaskSchedulerBuilder
bean 在上下文中都可用。
评论区