springboot2.6.2系列教程之缓存&调度&邮件&验证&服务-12


大多数应用程序在某些时候需要处理输入和输出问题。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.Cacheorg.springframework.cache.CacheManager接口实现的抽象。

通用的

如果上下文定义了至少一个org.springframework.cache.Cachebean ,则使用通用缓存。创建了一个CacheManager包装该类型的所有 bean。

JCache (JSR-107)

JCache通过类路径上的 来引导javax.cache.spi.CachingProvider(即,类路径上存在一个符合 JSR-107 的缓存库),并且JCacheCacheManagerspring-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"

如果您需要对配置进行更多控制,请考虑注册一个RedisCacheManagerBuilderCustomizerbean。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属性来限制可用缓存的列表。例如,如果您只需要cache1cache2缓存,请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可以使用JobBuilderAPI 构建实例。
  • Calendar.
  • Trigger:定义何时触发特定作业。

默认情况下,使用内存JobStore。但是,如果DataSourcebean 在您的应用程序中可用并且相应地配置了spring.quartz.job-store-type属性,则可以配置基于 JDBC 的存储,如以下示例所示:

spring:
  quartz:
    job-store-type: "jdbc"

使用 JDBC 存储时,可以在启动时初始化模式,如下例所示:

spring:
  quartz:
    jdbc:
      initialize-schema: "always"

要让 Quartz 使用DataSource除应用程序的 main 以外的bean,请DataSource声明一个DataSourcebean,并用 .注释其@Bean方法@QuartzDataSource。这样做可以确保 Quartz-specificDataSourceSchedulerFactoryBean和 用于模式初始化。类似地,要让 Quartz 使用TransactionManager非应用程序的 mainTransactionManager声明一个TransactionManagerbean,@Bean用 . 注释它的方法@QuartzTransactionManager

默认情况下,配置创建的作业不会覆盖已从持久作业存储中读取的已注册作业。要启用覆盖现有作业定义,请设置该spring.quartz.overwrite-existing-jobs属性。

Quartz Scheduler 配置可以使用spring.quartz属性和SchedulerFactoryBeanCustomizerbean 进行自定义,这允许编程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 使用 RestTemplateWebClient.

RestTemplate

如果需要从应用程序调用远程 REST 服务,可以使用 Spring Framework 的RestTemplate类。由于RestTemplate实例通常需要在使用之前进行自定义,因此 Spring Boot 不提供任何单个自动配置的RestTemplatebean。但是,它确实会自动配置 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 不提供任何单个自动配置的WebServiceTemplatebean。但是,它确实会自动配置 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 自动配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值