當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring系列(六):@Conditional注解用法介绍
生活随笔
收集整理的這篇文章主要介紹了
Spring系列(六):@Conditional注解用法介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天給大家介紹@Conditional懶加載注解用法,希望對大家能有所幫助!
? ? ? ? ? ? ? ?
1、@Conditional注解介紹
@Conditional是Spring4版本新提供的一種注解,它的作用是按照設定的條件進行判斷,把滿足判斷條件的bean注冊到Spring容器。
2、@Conditional的源碼內容如下:
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional {/*** All {@link Condition Conditions} that must {@linkplain Condition#matches match}* in order for the component to be registered.*/Class<? extends Condition>[] value(); }說明:
@Conditional可以作用在方法上,也可以作用在類上。
使用的時候需要傳入實現Condition接口類數組。
如果是類和方法都加了@Conditional注解,最終在方法上的注解為最終的條件,如果返回true則加入容器,反之不會加入容器。
如果只是類上加了@Conditional注解,整個類的所有方法都會加入容器中。
3、用法示例
3.1 新建Book.java 文件
package com.spring.bean;public class Book {private String bookName;private String bookType;private double price;public Book(String bookName, String bookType, double price) {this.bookName = bookName;this.bookType = bookType;this.price = price;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getBookType() {return bookType;}public void setBookType(String bookType) {this.bookType = bookType;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"bookName='" + bookName + '\'' +", bookType='" + bookType + '\'' +", price=" + price +'}';} }3.2 CNCondition.java 文件
package com.spring.condition;import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata;public class CNCondition implements Condition {public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {// user.language=CN 表示中文返回 truereturn conditionContext.getEnvironment().getProperty("user.language").contains("cn");} }3.3 ZHCondition.java 文件
package com.spring.condition;import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata;public class ZHCondition implements Condition {public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {// user.language=ZH Java默認語言 表示中文返回 truereturn conditionContext.getEnvironment().getProperty("user.language").contains("zh");} }3.4 新建TestConditionalConfig.java 配置文件
package com.spring.config;import com.spring.bean.Book; import com.spring.condition.CNCondition; import com.spring.condition.ZHCondition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration;@Configuration @Conditional(ZHCondition.class)public class TestConditionalConfig {@Bean@Conditional(ZHCondition.class)//中文public Book bookZH() {return new Book("紅樓夢","中國古典書籍",99.9);}@Bean@Conditional(CNCondition.class)//英文public Book bookCN() {return new Book("哈姆雷特","外國經典名著",66.6);} }3.5 新建TestConditional.java 測試文件
package com.spring.test;import com.spring.bean.Book; import com.spring.config.TestConditionalConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class TestConditional {public static void main(String[] args) {AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestConditionalConfig.class);Map<String, Book> map = annotationContext.getBeansOfType(Book.class);System.out.println(map);} }4、@Conditional應用場景
在一些需要條件滿足才是實例化的類中,使用此注解,
比如項目中需要根據不同的場景使用不同的消息中間件,在消息隊列的實例化bean上,使用@Conditional注解,根據配置文件的不同,來判斷哪個bean需要加載到Spring容器中。
5、@Conditional的擴展注解
@ConditionalOnBean:僅在當前上下文中存在某個對象時,才會實例化一個Bean。 @ConditionalOnClass:某個class位于類路徑上,才會實例化一個Bean。 @ConditionalOnExpression:當表達式值為true的時候,才會實例化一個Bean。 @ConditionalOnMissingBean:僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean。 @ConditionalOnMissingClass:某個class類路徑上不存在的時候,才會實例化一個Bean。 @ConditionalOnNotWebApplication:非web應用,才會實例化一個Bean。 @ConditionalOnBean:當容器中有指定Bean的條件下進行實例化。 @ConditionalOnMissingBean:當容器里沒有指定Bean的條件下進行實例化。 @ConditionalOnClass:當classpath類路徑下有指定類的條件下進行實例化。 @ConditionalOnMissingClass:當類路徑下沒有指定類的條件下進行實例化。 @ConditionalOnWebApplication:當項目是一個Web項目時進行實例化。 @ConditionalOnNotWebApplication:當項目不是一個Web項目時進行實例化。 @ConditionalOnProperty:當指定的屬性有指定的值時進行實例化。 @ConditionalOnExpression:基于SpEL表達式的條件判斷。 @ConditionalOnJava:當JVM版本為指定的版本范圍時觸發實例化。 @ConditionalOnResource:當類路徑下有指定的資源時觸發實例化。 @ConditionalOnJndi:在JNDI存在的條件下觸發實例化。 @ConditionalOnSingleCandidate:當指定的Bean在容器中只有一個,或者有多個但是指定了首選的Bean時,才會觸發實例化。IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的Spring系列(六):@Conditional注解用法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python定义一个列表_如何在Pyth
- 下一篇: linux重启memcache_Linu