{"id":65358,"date":"2020-08-31T15:31:10","date_gmt":"2020-08-31T15:31:10","guid":{"rendered":"https:\/\/www.baeldung.com\/?p=86273"},"modified":"2020-08-31T15:31:10","modified_gmt":"2020-08-31T15:31:10","slug":"the-spring-conditionalonproperty-annotation","status":"publish","type":"post","link":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/2020\/08\/31\/the-spring-conditionalonproperty-annotation\/","title":{"rendered":"The Spring @ConditionalOnProperty Annotation"},"content":{"rendered":"<p class=\"syndicated-attribution\"><meta name= \\\"keywords \\\" content= \\\"\u96fb\u5b50\u8a08\u7b97\u6a5f, \u6559\u80b2, IT \u96fb\u8166\u73ed,\u96fb\u8166\u88dc\u7fd2\uff0c \u96fb\u8166\u73ed\uff0c \u5bb6\u6559\uff0c \u79c1\u4eba\u8001\u5e2b\uff0c \u8cc7\u8a0a\u6280\u8853\uff0c \u7a0b\u5e8f\u8a2d\u8a08\uff0c \u96fb\u5b50\u8a08\u7b97\u6a5f\uff0c \u904a\u6232\uff0c \u860b\u679c\uff0c \u96fb\u5f71\uff0c \u8a08\u7b97\u6a5f\uff0c\u7de8\u78bc\uff0c Java\uff0c C\/C++\uff0c JavaScript\uff0c PHP\uff0c HTML\uff0c CSS\uff0c MySQL\uff0c mobile\uff0c Android\uff0c \u52d5\u6f2b\uff0c Python\uff0c teacher\uff0c \u88dc\u7fd2\uff0c \u96fb\u8166\u88dc\u7fd2 \u8cc7\u8a0a, \u7535\u5b50\u8ba1\u7b97\u673a, IT ,Game, apple, movie, Computer,student,Java,\u6559\u80b2, ,\u5b66\u751f, \u5b66\u4e60, learn, \u6559\u5b66,  Android, apple,anime, animation, \u4fe1\u606f\u6280\u672f, \u7a0b\u5e8f\u8bbe\u8ba1, \u79fb\u52a8\u7535\u8bdd, \u8cc7\u8a0a\u79d1\u6280,Game, Jeu, Juego,Call Of Duty ,\u4f7f\u547d\u53ec\u559a , \u6e38\u620f, \u7535\u5b50\u6e38\u620f,, \u591a\u4eba\u7535\u5b50\u6e38\u620f, \u7f51\u7edc\u6e38\u620f\uff0conline\uff0conline game, \u624b\u673a\u6e38\u620f, mobile \\\"><\/p>\n<h2 data-id=\"overview-1\">1. Overview<\/h2>\n<div class=\"bd-anchor\" id=\"overview-1\"><\/div>\n<p>In this short tutorial, we&#8217;re going to shed light on the main <strong>purpose of the <em>@ConditionalOnProperty<\/em> annotation<\/strong>.<\/p>\n<p>First, we&#8217;ll start with a bit of background about what <em>@ConditionalOnProperty<\/em> is. Then, we&#8217;ll look at some practical examples to help understand how it works and what features it brings.<\/p>\n<h2 data-id=\"the-purpose-of-conditionalonproperty\">2. The Purpose of <em>@ConditionalOnProperty<\/em><\/h2>\n<div class=\"bd-anchor\" id=\"the-purpose-of-conditionalonproperty\"><\/div>\n<p>Typically, when developing Spring-based applications, <strong>we may need to <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-bean\">create some beans<\/a> conditionally based on the presence and the value of a configuration property<\/strong>.<\/p>\n<p>For example, we may want to register a <em>DataSource<\/em> bean to point to a production or a test database depending on if we set a property value to &#8220;prod&#8221; or &#8220;test&#8221;.<\/p>\n<p>Fortunately, achieving that isn&#8217;t as hard as it might look upon first glance. The Spring framework provides the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-boot-custom-auto-configuration#3-property-conditions\"><em>@ConditionalOnProperty<\/em> annotation<\/a> precisely for this purpose.<\/p>\n<p>In short, the <em>@ConditionalOnProperty <\/em>enables bean registration only if an environment property is present and has a specific value. By default, the specified property must be defined and not equal to <em>false<\/em>.<\/p>\n<p>Now that we&#8217;re familiar with the purpose of the <em>@ConditionalOnProperty<\/em> annotation, let&#8217;s dig deeper to see how it works.<\/p>\n<h2 data-id=\"the-conditionalonproperty-annotation-in-practice\">3. The <em>@ConditionalOnProperty<\/em> Annotation in Practice<\/h2>\n<div class=\"bd-anchor\" id=\"the-conditionalonproperty-annotation-in-practice\"><\/div>\n<p>To exemplify the use of <em>@ConditionalOnProperty, <\/em>we&#8217;ll develop a basic notification system. To keep things simple for now, let&#8217;s assume that we want to send email notifications.<\/p>\n<p>First, we&#8217;ll need to create a simple service to send a notification message. For instance, consider the <em>NotificationSender<\/em> interface:<\/p>\n<pre><code class=\"language-java\">public interface NotificationSender {\r\n    String send(String message);\r\n}<\/code><\/pre>\n<p>Next, let&#8217;s provide an implementation of the <em>NotificationSender<\/em> interface to send our emails:<\/p>\n<pre><code class=\"language-java\">public class EmailNotification implements NotificationSender {\r\n    @Override\r\n    public String send(String message) {\r\n        return \"Email Notification: \" + message;\r\n    }\r\n}<\/code><\/pre>\n<p>Now, let&#8217;s see how to make use of the <em>@ConditionalOnProperty<\/em> annotation. <strong>Let&#8217;s configure the <em>NotificationSender<\/em> bean in such a way that it will only be loaded if the property <em>notification.service<\/em> is defined<\/strong>:<\/p>\n<pre><code class=\"language-java\">@Bean(name = \"emailNotification\")\r\n@ConditionalOnProperty(prefix = \"notification\", name = \"service\")\r\npublic NotificationSender notificationSender() {\r\n    return new EmailNotification();\r\n}<\/code><\/pre>\n<p>As we can see, the <strong><em>prefix<\/em> and <em>name<\/em> attributes are used to denote the configuration property that should be checked<\/strong>.<\/p>\n<p>Finally, we need to add the last missing piece of the puzzle. Let&#8217;s define our custom property in the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/properties-with-spring#1-applicationproperties---the-default-property-file\"><em>application.properties<\/em> file<\/a>:<\/p>\n<pre><code class=\"language-xml\">notification.service=email<\/code><\/pre>\n<h2 data-id=\"advanced-configuration\">4. Advanced Configuration<\/h2>\n<div class=\"bd-anchor\" id=\"advanced-configuration\"><\/div>\n<p>As we have already learned, the <em>@ConditionalOnProperty<\/em> annotation allows us to register beans conditionally depending on the presence of a configuration property.<\/p>\n<p>However, we can do more than just that with this annotation<em>.<\/em> So, let&#8217;s explore!<\/p>\n<p>Let&#8217;s suppose we want to add another notification service \u2014 for example, a service that will allow us to send SMS notifications.<\/p>\n<p>To do that, we need to create another <em>NotificationSender <\/em>implementation:<\/p>\n<pre><code class=\"language-java\">public class SmsNotification implements NotificationSender {\r\n    @Override\r\n    public String send(String message) {\r\n        return \"SMS Notification: \" + message;\r\n    }\r\n}<\/code><\/pre>\n<p>Since we have two implementations, let&#8217;s see how we can use <em>@ConditionalOnProperty <\/em>to load the right <em>NotificationSender<\/em> bean conditionally.<\/p>\n<p>For this purpose, the annotation provides the <em>havingValue <\/em>attribute. Quite interestingly, <strong>it<\/strong> <strong>defines the value that a property must have in order for a specific bean to be added to the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/inversion-control-and-dependency-injection-in-spring#the-spring-ioc-container\">Spring container<\/a><\/strong>.<\/p>\n<p>Now, let&#8217;s specify under what condition we want to register the <em>SmsNotification<\/em> implementation in the context:<\/p>\n<pre><code class=\"language-java\">@Bean(name = \"smsNotification\")\r\n@ConditionalOnProperty(prefix = \"notification\", name = \"service\", havingValue = \"sms\")\r\npublic NotificationSender notificationSender2() {\r\n    return new SmsNotification();\r\n}<\/code><\/pre>\n<p>With the help of the <em>havingValue<\/em> attribute, we made it clear that we want to load <em>SmsNotification<\/em>\u00a0only when <em>notification.service <\/em>is set to <em>sms<\/em>.<\/p>\n<p>It&#8217;s worth mentioning that <em>@ConditionalOnProperty <\/em>has another attribute called <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/docs.spring.io\/spring-boot\/docs\/current\/api\/org\/springframework\/boot\/autoconfigure\/condition\/ConditionalOnProperty.html#matchIfMissing--\"><em>matchIfMissing<\/em><\/a>. <strong>This attribute specifies whether the condition should match in case the property is not available<\/strong>.<\/p>\n<p>Now, let&#8217;s put all the pieces together and write a simple test case to confirm that everything works as expected:<\/p>\n<pre><code class=\"language-java\">@Test\r\npublic void whenValueSetToEmail_thenCreateEmailNotification() {\r\n    this.contextRunner.withPropertyValues(\"notification.service=email\")\r\n        .withUserConfiguration(NotificationConfig.class)\r\n        .run(context -&gt; {\r\n            assertThat(context).hasBean(\"emailNotification\");\r\n            NotificationSender notificationSender = context.getBean(EmailNotification.class);\r\n            assertThat(notificationSender.send(\"Hello From Baeldung!\")).isEqualTo(\"Email Notification: Hello From Baeldung!\");\r\n            assertThat(context).doesNotHaveBean(\"smsNotification\");\r\n        });\r\n}<\/code><\/pre>\n<h2 data-id=\"conclusion-1\">5. Conclusion<\/h2>\n<div class=\"bd-anchor\" id=\"conclusion-1\"><\/div>\n<p>In this short tutorial, we highlighted the purpose of using the <em>@ConditionalOnProperty <\/em>annotation<em>. <\/em>Then, we showcased, through a practical example, how to use it to load Spring beans conditionally.<\/p>\n<p>As always, the full source code of this tutorial is available <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/eugenp\/tutorials\/tree\/master\/spring-boot-modules\/spring-boot-autoconfiguration\">over on GitHub<\/a>.<\/p>\n<p>The post <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-conditionalonproperty\/\" >The Spring @ConditionalOnProperty Annotation<\/a> first appeared on <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/\" >Baeldung<\/a>.<\/p>\n<p><Img align=\"left\" border=\"0\" height=\"1\" width=\"1\" alt=\"\" style=\"border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;\" hspace=\"0\" src=\"https:\/\/feeds.feedblitz.com\/~\/i\/634850638\/0\/baeldung\"><\/p>\n<div style=\"clear:both;padding-top:0.2em;\"><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634850638\/baeldung,\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/spring-conditionalonproperty#respond\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&#160;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/spring-conditionalonproperty\/feed\/\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&#160;<\/div>\n\n<p class=\"syndicated-attribution\"><figure class= \\\"wp-block-image alignnone \\\"><img src= \\\"http:\/\/itteacheritfreelance.hk\/test\/wordpress\/wp-content\/uploads\/2016\/05\/logo2-2.png\\\" alt=\\\"IT\u96fb\u8166\u88dc\u7fd2 java\u88dc\u7fd2 \u70ba\u5927\u5bb6\u914d\u5c0d\u96fb\u8166\u88dc\u7fd2,IT freelance, \u79c1\u4eba\u8001\u5e2b, PHP\u88dc\u7fd2,CSS\u88dc\u7fd2,XML,Java\u88dc\u7fd2,MySQL\u88dc\u7fd2,graphic design\u88dc\u7fd2,\u4e2d\u5c0f\u5b78ICT\u88dc\u7fd2,\u4e00\u5c0d\u4e00\u79c1\u4eba\u88dc\u7fd2\u548cFreelance\u81ea\u7531\u5de5\u4f5c\u914d\u5c0d\u3002\\\"\/><figcaption>\u7acb\u523b\u8a3b\u518a\u53ca\u5831\u540d\u96fb\u8166\u88dc\u7fd2\u8ab2\u7a0b\u5427!<\/figcaption><\/figure>\r\n<\/br>Find A Teacher Form:\r\n<\/br>https:\/\/docs.google.com\/forms\/d\/1vREBnX5n262umf4wU5U2pyTwvk9O-JrAgblA-wH9GFQ\/viewform?edit_requested=true#responses\r\n<\/br><\/br>Email:\r\n<\/br>public1989two@gmail.com<br><br><br><br><br><br><br>\r\n<a href=www.itsec.hk style=color:#FFFFFF;>www.itsec.hk<\/a><br>\r\n<a href=\\\"www.itsec.vip\\\" style=color:#FFFFFF;>www.itsec.vip<\/a><br>\r\n<a href=\\\"www.itseceu.uk\\\" style=color:#FFFFFF;>www.itseceu.uk<\/a><br><\/p>","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Learn all about the Spring @ConditionalOnProperty annotation.<\/p>\n<p>The post <a rel=\"NOFOLLOW noopener noreferrer\" href=\"https:\/\/feeds.feedblitz.com\/~\/634850638\/0\/baeldung~The-Spring-ConditionalOnProperty-Annotation\/\" target=\"_blank\">The Spring @ConditionalOnProperty Annotation<\/a> first appeared on <a rel=\"NOFOLLOW noopener noreferrer\" href=\"https:\/\/www.baeldung.com\/\" target=\"_blank\">Baeldung<\/a>.<\/p>\n<div><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\"><\/a>&nbsp;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\"><\/a>&nbsp;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634850638\/baeldung,\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\"><\/a>&nbsp;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\"><\/a>&nbsp;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\"><\/a>&nbsp;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634850638\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\"><\/a>&nbsp;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/spring-conditionalonproperty#respond\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&nbsp;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/spring-conditionalonproperty\/feed\/\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&nbsp;<\/div>\n<\/div>","protected":false},"author":792,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"The Spring @ConditionalOnProperty Annotation - ITTeacherITFreelance.hk","description":"Learn all about the Spring @ConditionalOnProperty annotation. The post The Spring @ConditionalOnProperty Annotation first appeared on Baeldung . &nbsp; &nbsp; &"},"footnotes":""},"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/65358"}],"collection":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/792"}],"replies":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=65358"}],"version-history":[{"count":9,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/65358\/revisions"}],"predecessor-version":[{"id":69165,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/65358\/revisions\/69165"}],"wp:attachment":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=65358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=65358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=65358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}