Spring 中的 @ConditionalOnProperty 注解

这篇具有很好参考价值的文章主要介绍了Spring 中的 @ConditionalOnProperty 注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、概述

介绍@ConditionalOnProperty注解的主要目的。

2、@ConditionalOnProperty的目的

通常,在开发基于Spring的应用程序时,可能需要根据配置属性的存在和值有条件地创建一些bean。

例如,取决于是否将属性值设置为“ prod”或“ test”,可能想要注册一个DataSource bean来指向生产或测试数据库。

幸运的是,实现这一目标并不像想象的那样困难。 Spring框架正是为此目的提供了@ConditionalOnProperty注解。

简而言之,@ConditionalOnProperty仅在存在环境属性且具有特定值的情况下才启用Bean注册。 默认情况下,必须定义指定的属性,并且不等于false。

现在已经熟悉了@ConditionalOnProperty注解的用途,接下来深入地了解它的工作原理。

3、实践中的@ConditionalOnProperty注解

为了举例说明@ConditionalOnProperty的用法,接下来开发一个基本的通知系统。 为了使事情现在变得简单,假设要发送电子邮件通知。

首先,需要创建一个简单的服务来发送通知消息。 例如,考虑NotificationSender接口:

public interface NotificationSender {
    String send(String message);
}

接下来,提供NotificationSender接口的实现,以发送电子邮件:

public class EmailNotification  implements NotificationSender {
    @Override
    public String send(String message) {
        return "Email Notification: " + message;
    }
}

现在,看看如何使用@ConditionalOnProperty注解。 以这样的方式配置NotificationSender Bean,使其仅在定义了属性notification.service时才加载:

@Bean(name = "emailNotification")
@ConditionalOnProperty(prefix = "notification", name = "service")
public NotificationSender notificationSender() {
    return new EmailNotification();
}

prefix和name属性用于表示应检查的配置属性。

最后,需要在application.properties文件中定义的自定义属性:

notification.service=email

4、高级配置

正如前面已经了解的那样,@ConditionalOnProperty注解允许根据配置属性的存在条件有条件地注册bean。

使用此注释,可以做更多的事情。

假设要添加另一个通知服务,例如,一个允许发送SMS通知的服务。

为此,需要创建另一个NotificationSender实现:

public class SmsNotification implements NotificationSender {
    @Override
    public String send(String message) {
        return "SMS Notification: " + message;
    }
}

由于有两个实现,看看如何使用@ConditionalOnProperty有条件地加载正确的NotificationSender bean。

注解提供了havingValue属性。 非常有趣的是,它定义了一个属性必须具有的值,以便将特定的Bean添加到Spring容器中。

现在,指定要在什么条件下在上下文中注册SmsNotification实现:

@Bean(name = "smsNotification")
@ConditionalOnProperty(prefix = "notification", name = "service", havingValue = "sms")
public NotificationSender notificationSender2() {
    return new SmsNotification();
}
    

借助于hadingValue属性,清楚地表明,仅当notification.service设置为sms时,才希望加载SmsNotification。

@ConditionalOnProperty具有另一个名为matchIfMissing的属性。 此属性指定在属性不可用的情况下条件是否应匹配。

单元测: 文章来源地址https://www.toymoban.com/news/detail-563131.html

public class NotificationUnitTest {

    private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();

    @Test
    public void sender() {
        this.contextRunner.withPropertyValues("notification.service=email")
                .withUserConfiguration(NotificationConfig.class)
                .run(context -> {
                    assertThat(context).hasBean("emailNotification");
                    NotificationSender notificationSender = context.getBean(EmailNotification.class);
                    assertThat(notificationSender.send("Hello From spring!")).isEqualTo("Email Notification: Hello From spring!");
                    assertThat(context).doesNotHaveBean("smsNotification");
                });
    }
}

到了这里,关于Spring 中的 @ConditionalOnProperty 注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring中的自定义注解

    在Spring中,注解是一种非常使用的工具。 因其强大的功能,极大的提高了我们开发效率。 但是当遇到一些特殊业务时,框架自有的注解已经不能满足我们的需求了,这时我们就可以添加自定义注解来满足我们的业务需求。 我们用 @interface 来声明这是一个注解类。 另外需要在

    2024年02月11日
    浏览(39)
  • Spring Boot 中的 @EnableDiscoveryClient 注解

    Spring Boot 是一个快速开发 Spring 应用程序的框架,它提供了一些基础设施,使得我们可以快速地开发出高效、可靠的应用程序。其中,@EnableDiscoveryClient 注解是 Spring Boot 中一个非常重要的注解,它提供了一种便捷的方式来将 Spring Boot 应用程序注册到服务注册中心中。本文将介

    2024年02月12日
    浏览(37)
  • Spring Boot 中的 @HystrixCommand 注解

    在分布式系统中,服务之间的调用是不可避免的。但随着服务数量的增加,服务之间的依赖关系也会变得越来越复杂,服务的故障也会变得越来越常见。一旦某个服务出现故障,它所依赖的服务也会受到影响,导致整个系统出现故障。为了应对这种情况,Netflix 开发了 Hystri

    2024年02月17日
    浏览(28)
  • Spring Boot中的@EnableAutoConfiguration注解

    Spring Boot是一个非常流行的Java框架,它可以快速创建基于Spring的应用程序。Spring Boot提供了许多自动配置功能,使得开发者可以非常容易地创建一个可运行的应用程序。其中,@EnableAutoConfiguration注解是Spring Boot自动配置功能的核心之一。 @EnableAutoConfiguration注解是Spring Boot的核心

    2024年02月11日
    浏览(52)
  • Spring Boot 中的 @Cacheable 注解

    在 Spring Boot 中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,其中最常用的是 @Cacheable 注解。 @Cacheable 注解用于标记一个方法需要被缓存

    2024年02月12日
    浏览(51)
  • Spring Boot 中的 @CacheEvict 注解

    在 Spring Boot 中,缓存是提高应用性能的重要手段。为了更好地管理缓存,Spring Boot 提供了一系列的缓存注解,其中 @CacheEvict 注解用于清空缓存。 本文将介绍 @CacheEvict 注解的含义、原理以及如何使用。 @CacheEvict 注解用于清空缓存。它可以标注在方法上,表示在执行该方法后

    2024年02月09日
    浏览(38)
  • Spring框架中的@Conditional系列注解

    Conditional 是由SpringFramework提供的一个注解,位于 org.springframework.context.annotation 包内,定义如下。 SpringBoot 模块大量的使用@Conditional 注释,我们可以将Spring的@Conditional注解用于以下场景: 可以作为类级别的注解直接或者间接的与@Component相关联,包括@Configuration类; 可以作为元

    2024年02月08日
    浏览(30)
  • Spring Boot 中的 @Field 注解详解

    Spring Boot 是目前 Java 生态圈中最受欢迎的 Web 应用开发框架之一,它提供了很多优秀的功能和工具,可以帮助开发者快速构建高效、可靠的 Web 应用程序。其中一个重要的功能就是数据绑定和验证,Spring Boot 提供了多种方式来绑定请求参数、表单数据、JSON 数据等。其中,@Fi

    2024年02月11日
    浏览(26)
  • Spring MVC中的一些常用注解

    目录 @RequestMapping 实现路由映射 限制请求方式 @PathVariable 从url中获取变量的值 更改绑定参数的名字 @RequestParam 可以传递集合  更改绑定参数的名字 可修改是否为必传参数 @RequestBody 获取请求正文的内容  可修改是否为必传参数 @RequestPart 可以支持上传文件 更改绑定参数的名字

    2024年01月19日
    浏览(33)
  • 【Spring全家桶系列】Spring中的事务管理(基于注解完成实现)

    ⭐️ 前面的话 ⭐️ 本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍Spring中的事务管理,事务的概念与作用,以及Spring事务的属性和传播机制。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由 未见花闻 原创, CSDN 首发! 📆首

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包