目录
大多数应用程序在某些时候需要处理输入和输出问题。Spring Boot 提供实用程序和与一系列技术的集成,以在您需要 IO 功能时提供帮助。本节涵盖标准 IO 功能(例如缓存和验证)以及更高级的主题(例如调度和分布式事务)。我们还将介绍调用远程 REST 或 SOAP 服务以及发送电子邮件。
缓存
Spring 框架支持透明地向应用程序添加缓存。在其核心,抽象将缓存应用于方法,从而减少基于缓存中可用信息的执行次数。缓存逻辑是透明应用的,对调用者没有任何干扰。只要使用@EnableCaching
注解启用缓存支持,Spring Boot 就会自动配置缓存基础结构。
简而言之,要向服务的操作添加缓存,请将相关注释添加到其方法中,如以下示例所示:
@Component
public class MyMathService {
@Cacheable("piDecimals")
public int computePiDecimal(int precision) {
...
}
}
如果不添加任何特定的缓存库,Spring Boot 会自动配置一个简单的提供程序,该提供程序在内存中使用并发映射。当需要缓存时,此提供程序会为您创建它。不建议将简单提供程序用于生产用途,但它非常适合入门并确保您了解这些功能。
支持的缓存提供程序
缓存抽象不提供实际的存储,它依赖于org.springframework.cache.Cache
和org.springframework.cache.CacheManager
接口实现的抽象。
通用的
如果上下文定义了至少一个org.springframework.cache.Cache
bean ,则使用通用缓存。创建了一个CacheManager
包装该类型的所有 bean。
JCache (JSR-107)
JCache通过类路径上的 来引导javax.cache.spi.CachingProvider
(即,类路径上存在一个符合 JSR-107 的缓存库),并且JCacheCacheManager
由spring-boot-starter-cache
“Starter”提供。有各种兼容的库可用,Spring Boot 为 Ehcache 3、Hazelcast 和 Infinispan 提供了依赖管理。也可以添加任何其他兼容的库。
可能存在多个提供者,在这种情况下必须明确指定提供者。即使 JSR-107 标准没有强制使用标准化的方式来定义配置文件的位置,Spring Boot 也会尽最大努力适应使用实现细节设置缓存,如下例所示:
# Only necessary if more than one provider is present
spring:
cache:
jcache:
provider: "com.example.MyCachingProvider"
config: "classpath:example.xml"
redis
如果Redis可用且已配置,则 RedisCacheManager是自动配置的。可以通过设置
spring.cache.cache-names属性在启动时创建额外的缓存,并且可以使用
spring.cache.redis.*属性配置缓存默认值。例如,以下配置以10 分钟*的生存时间*
cache1创建和
cache2`缓存:
spring:
cache:
cache-names: "cache1,cache2"
redis:
time-to-live: "10m"
如果您需要对配置进行更多控制,请考虑注册一个RedisCacheManagerBuilderCustomizer
bean。cache1
以下示例显示了一个自定义程序,该自定义程序为和配置特定的生存时间cache2
:
@Configuration(proxyBeanMethods = false)
public class MyRedisCacheManagerConfiguration {
@Bean
public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {
return (builder) -> builder
.withCacheConfiguration("cache1", RedisCacheConfiguration
.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)))
.withCacheConfiguration("cache2", RedisCacheConfiguration
.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));
}
}
简单的
如果找不到其他提供程序,ConcurrentHashMap
则配置使用 作为缓存存储的简单实现。如果您的应用程序中不存在缓存库,则这是默认设置。默认情况下,缓存是根据需要创建的,但您可以通过设置cache-names
属性来限制可用缓存的列表。例如,如果您只需要cache1
和cache2
缓存,请cache-names
按如下方式设置属性:
spring:
cache:
cache-names: "cache1,cache2"
如果您这样做并且您的应用程序使用未列出的缓存,那么它在运行时需要缓存时会失败,但在启动时不会失败。如果您使用未声明的缓存,这类似于“真实”缓存提供程序的行为方式。
没有任何
当@EnableCaching
您的配置中存在时,也需要合适的缓存配置。如果您需要在某些环境中完全禁用缓存,请强制缓存类型none
使用无操作实现,如下例所示:
spring:
cache:
type: "none"
调度
Spring Boot 为使用Quartz 调度程序提供了多种便利,包括spring-boot-starter-quartz
“Starter”。如果 Quartz 可用,则 aScheduler
是自动配置的(通过SchedulerFactoryBean
抽象)。
以下类型的 Bean 会被自动拾取并与 相关联Scheduler
:
JobDetail
: 定义一个特定的 Job。JobDetail
可以使用JobBuilder
API 构建实例。Calendar
.Trigger
:定义何时触发特定作业。
默认情况下,使用内存JobStore
。但是,如果DataSource
bean 在您的应用程序中可用并且相应地配置了spring.quartz.job-store-type
属性,则可以配置基于 JDBC 的存储,如以下示例所示:
spring:
quartz:
job-store-type: "jdbc"
使用 JDBC 存储时,可以在启动时初始化模式,如下例所示:
spring:
quartz:
jdbc:
initialize-schema: "always"
要让 Quartz 使用DataSource
除应用程序的 main 以外的bean,请DataSource
声明一个DataSource
bean,并用 .注释其@Bean
方法@QuartzDataSource
。这样做可以确保 Quartz-specificDataSource
被SchedulerFactoryBean
和 用于模式初始化。类似地,要让 Quartz 使用TransactionManager
非应用程序的 mainTransactionManager
声明一个TransactionManager
bean,@Bean
用 . 注释它的方法@QuartzTransactionManager
。
默认情况下,配置创建的作业不会覆盖已从持久作业存储中读取的已注册作业。要启用覆盖现有作业定义,请设置该spring.quartz.overwrite-existing-jobs
属性。
Quartz Scheduler 配置可以使用spring.quartz
属性和SchedulerFactoryBeanCustomizer
bean 进行自定义,这允许编程SchedulerFactoryBean
自定义。高级 Quartz 配置属性可以使用spring.quartz.properties.*
.
发送电子邮件
Spring Framework 提供了使用接口发送电子邮件的抽象JavaMailSender
,Spring Boot 为其提供了自动配置以及启动模块。
如果spring.mail.host
相关库(由 定义spring-boot-starter-mail
)可用,JavaMailSender
则创建默认值(如果不存在)。可以通过命名空间中的配置项进一步自定义发送者spring.mail
。有关MailProperties
更多详细信息,请参阅。
特别是,某些默认超时值是无限的,您可能需要更改它以避免线程被无响应的邮件服务器阻塞,如以下示例所示:
spring:
mail:
properties:
"[mail.smtp.connectiontimeout]": 5000
"[mail.smtp.timeout]": 3000
"[mail.smtp.writetimeout]": 5000
也可以JavaMailSender
使用现有Session
的 JNDI 配置 a:
spring:
mail:
jndi-name: "mail/Session"
验证
只要类路径上有 JSR-303 实现(例如 Hibernate 验证器),Bean Validation 1.1 支持的方法验证功能就会自动启用。javax.validation
这让 bean 方法可以在其参数和/或返回值上使用约束进行注释。具有此类注释方法的目标类需要@Validated
在类型级别使用注释进行注释,以便在其方法中搜索内联约束注释。
例如,以下服务触发第一个参数的验证,确保其大小在 8 到 10 之间:
@Service
@Validated
public class MyBean {
public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code, Author author) {
return ...
}
}
调用REST服务
如果您的应用程序调用远程 REST 服务,Spring Boot 使用 RestTemplate
或WebClient
.
RestTemplate
如果需要从应用程序调用远程 REST 服务,可以使用 Spring Framework 的RestTemplate
类。由于RestTemplate
实例通常需要在使用之前进行自定义,因此 Spring Boot 不提供任何单个自动配置的RestTemplate
bean。但是,它确实会自动配置 a RestTemplateBuilder
,可用于RestTemplate
在需要时创建实例。自动配置RestTemplateBuilder
可确保将 sensibleHttpMessageConverters
应用于RestTemplate
实例。
下面的代码展示了一个典型的例子:
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
网络服务
Spring Boot 提供 Web 服务自动配置,因此您所要做的就是定义您的Endpoints
.
使用该模块可以轻松访问Spring Web Services 功能。spring-boot-starter-webservices
SimpleWsdl11Definition``SimpleXsdSchema
可以分别为您的 WSDL 和 XSD 自动创建和bean。为此,请配置它们的位置,如以下示例所示:
spring:
webservices:
wsdl-locations: "classpath:/wsdl"
使用 WebServiceTemplate 调用 Web 服务
如果需要从应用程序调用远程 Web 服务,可以使用WebServiceTemplate
该类。由于WebServiceTemplate
实例通常需要在使用之前进行自定义,因此 Spring Boot 不提供任何单个自动配置的WebServiceTemplate
bean。但是,它确实会自动配置 a WebServiceTemplateBuilder
,可用于WebServiceTemplate
在需要时创建实例。
下面的代码展示了一个典型的例子:
@Service
public class MyService {
private final WebServiceTemplate webServiceTemplate;
public MyService(WebServiceTemplateBuilder webServiceTemplateBuilder) {
this.webServiceTemplate = webServiceTemplateBuilder.build();
}
public SomeResponse someWsCall(SomeRequest detailsReq) {
return (SomeResponse) this.webServiceTemplate.marshalSendAndReceive(detailsReq,
new SoapActionCallback("https://ws.example.com/action"));
}
}
默认情况下,使用类路径上可用的 HTTP 客户端库WebServiceTemplateBuilder
检测合适的基于HTTP 的。WebServiceMessageSender
您还可以自定义读取和连接超时,如下所示:
@Configuration(proxyBeanMethods = false)
public class MyWebServiceTemplateConfiguration {
@Bean
public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder) {
WebServiceMessageSender sender = new HttpWebServiceMessageSenderBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(2))
.build();
return builder.messageSenders(sender).build();
}
}
使用 JTA 的分布式事务
Spring Boot 使用Atomikos嵌入式事务管理器支持跨多个 XA 资源的分布式 JTA 事务。部署到合适的 Java EE 应用服务器时也支持 JTA 事务。
当检测到 JTA 环境时,使用 SpringJtaTransactionManager
来管理事务。自动配置的 JMS、DataSource 和 JPA bean 已升级为支持 XA 事务。您可以使用标准的 Spring 习惯用法,例如@Transactional
,来参与分布式事务。如果您在 JTA 环境中并且仍想使用本地事务,则可以将spring.jta.enabled
属性设置false
为禁用 JTA 自动配置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY