欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring 4.0新功能:@Conditional注解詳細(xì)介紹

 更新時(shí)間:2017年09月06日 10:29:06   作者:沈子平  
Spring Boot的強(qiáng)大之處在于使用了Spring 4框架的新特性:@Conditional注釋,此注釋使得只有在特定條件滿足時(shí)才啟用一些配置。下面這篇文章主要給大家介紹了關(guān)于Spring4.0中新功能:@Conditional注解的相關(guān)資料,需要的朋友可以參考下。

前言

最近在學(xué)習(xí)spring,抽空會(huì)將學(xué)習(xí)的知識(shí)總結(jié)下面,本文我們會(huì)接觸spring 4的新功能:@Conditional注解。在之前的spring版本中,你處理conditions只有以下兩個(gè)方法:

  • 在3.1版本之前,你需要使用spring expression language
  • 在3.1版本發(fā)布時(shí),profiles被引入來(lái)處理conditions。

讓我們分別看看以上兩者,在來(lái)理解spring 4帶來(lái)的@Conditional注解。

Spring Expression Language(SPeL)

SPeL的三元標(biāo)識(shí)符(IF-THEN-ELSE)可以在spring配置文件中用來(lái)表達(dá)條件語(yǔ)句。

<bean id="flag">
 <constructor-arg value="#{systemProperties['system.propery.flag'] ?: false }" />
</bean>
<bean id="bean">
 <property name="property" value="#{ flag ? 'yes' : 'no' }"/>
</bean>

這個(gè)bean的屬性依賴于flag的值,該值是使用外部屬性注入的,這樣bean就具有了動(dòng)態(tài)的能力。

使用 Profiles

這是在spring 3.1引入的。像下面這樣使用。

<!-- default configuration - will be loaded if no profile is specified -->
<!-- This will only work if it's put at the end of the configuration file -->
<!-- so no bean definitions after that -->
<beans profile="default">
  <import resource="classpath:default.xml" />
</beans>
<!-- some other profile -->
<beans profile="otherProfile">
 <import resource="classpath:other-profile.xml" />
</beans>

使用spring 4的@Conditional注解

現(xiàn)在介紹@Conditional注解。官方文檔的說(shuō)明是“只有當(dāng)所有指定的條件都滿足是,組件才可以注冊(cè)”。主要的用處是在創(chuàng)建bean時(shí)增加一系列限制條件。

Conditional接口的聲明如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE, ElementType.METHOD)
public @interface Conditional{
 Class <!--?extends Condition-->[] value();
}

所以@Conditional注解使用方法如下

  • 類型級(jí)別,可以在@Component 或是 @Configuration類上使用
  • 原型級(jí)別,可以用在其他自定義的注解上
  • 方法級(jí)別,可以用在@Bean的方法上

如果一個(gè)@Configuration類使用了@Conditional,會(huì)影響所有@Bean方法和@Import關(guān)聯(lián)類

public interface Condition{
/** Determine if the condition matches.
* @param context the condition context
* @param metadata meta-data of the {@link AnnotationMetadata class} or
* {@link Method method} being checked.
* @return {@code true} if the condition matches and the component can be registered
* or {@code false} to veto registration.
*/
boolean matches(ConditionContext context, AnnotatedTypeMedata metadata);
}

下面是一個(gè)例子

public class SystemPropertyCondition implements Condition {
 @Override
 public boolean matches(ConditionContext context, AnnotatedTypeMetadata   metadata) {
  return (System.getProperty("flag") != null);
 }
}

class SystemPropertyAbsentCondition implements Condition {
 @Override
 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  return (System.getProperty("flag") == null);
 }
}

這里我們有兩個(gè)類:SystemPropertyCondition和SystemPropertyAbsentCondtion. 這兩個(gè)類都實(shí)現(xiàn)了Condition接口.覆蓋的方法基于屬性flag返回一個(gè)布爾值。

現(xiàn)在我們定義兩個(gè)類,一個(gè)是positive條件,一個(gè)是negative條件:

@Bean
@Conditional(SystemPropertyCondition.class)
public SampleService service1() {
 return new SampleServiceImpl1();
}

@Bean
@Conditional(SystemPropertyAbsentCondition.class)
public SampleService service2() {
 return new SampleServiceImpl2();
}

上面提到的profiles已經(jīng)通過(guò)conditional原型注解進(jìn)行了修改。

總結(jié)

本文介紹了spring 4的conditianal注解。注意condition注解是不會(huì)繼承的。如果一個(gè)父類使用了conditional注解,其子類是不會(huì)擁有conditions的。如果你動(dòng)手嘗試以上的例子,會(huì)幫助你獲得更好的理解。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Spring?boot2.0?實(shí)現(xiàn)日志集成的方法(2)

    Spring?boot2.0?實(shí)現(xiàn)日志集成的方法(2)

    這篇文章主要介紹了Spring?boot2.0?實(shí)現(xiàn)日志集成的方法,上一章講解了spring?boot日志簡(jiǎn)單集成,這篇我們將日志進(jìn)行分類,常規(guī)日志、異常日志、監(jiān)控日志等,需要將日志輸出到不同的文件,具體內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • Java基礎(chǔ)之教你怎么用代碼一鍵生成POJO

    Java基礎(chǔ)之教你怎么用代碼一鍵生成POJO

    這篇文章主要介紹了Java基礎(chǔ)之教你怎么用代碼一鍵生成POJO,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 詳細(xì)聊聊SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的方法

    詳細(xì)聊聊SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的方法

    在大型分布式項(xiàng)目中,經(jīng)常會(huì)出現(xiàn)多數(shù)據(jù)源的情況,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • JDBC鏈接數(shù)據(jù)庫(kù)的幾個(gè)步驟

    JDBC鏈接數(shù)據(jù)庫(kù)的幾個(gè)步驟

    這篇文章主要介紹了JDBC鏈接數(shù)據(jù)庫(kù)的幾個(gè)步驟,通過(guò)將數(shù)據(jù)庫(kù)的連接放在一個(gè)工具類里面,達(dá)到重用的效果,需要的朋友可以參考下
    2015-07-07
  • Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并保存到本地

    Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并保存到本地

    這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并將文件保存到本地效果的方法,文中的示例代講解詳細(xì),需要的可以參考一下
    2022-09-09
  • 一文徹底弄懂零拷貝原理以及java實(shí)現(xiàn)

    一文徹底弄懂零拷貝原理以及java實(shí)現(xiàn)

    零拷貝(英語(yǔ): Zero-copy) 技術(shù)是指計(jì)算機(jī)執(zhí)行操作時(shí),CPU不需要先將數(shù)據(jù)從某處內(nèi)存復(fù)制到另一個(gè)特定區(qū)域,下面這篇文章主要給大家介紹了關(guān)于零拷貝原理以及java實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 關(guān)于kafka消費(fèi)不到遠(yuǎn)程bootstrap-server?數(shù)據(jù)的問(wèn)題

    關(guān)于kafka消費(fèi)不到遠(yuǎn)程bootstrap-server?數(shù)據(jù)的問(wèn)題

    很多朋友遇到kafka消費(fèi)不到遠(yuǎn)程bootstrap-server?數(shù)據(jù)的問(wèn)題,怎么解決這個(gè)問(wèn)題,很多朋友不知所措,下面小編給大家?guī)?lái)了關(guān)于kafka消費(fèi)不到遠(yuǎn)程bootstrap-server?數(shù)據(jù)的問(wèn)題及解決方法,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Java中properties文件中的中文亂碼問(wèn)題

    Java中properties文件中的中文亂碼問(wèn)題

    Properties為了方便用戶的配置,用于讀取Java的配置文件,不同的編程語(yǔ)言有自己所支持的配置文件,能讓用戶夠脫離程序本身去修改相關(guān)的變量設(shè)置,這篇文章主要介紹了Java中properties文件中的中文亂碼問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • 教你怎么用java實(shí)現(xiàn)客戶端與服務(wù)器一問(wèn)一答

    教你怎么用java實(shí)現(xiàn)客戶端與服務(wù)器一問(wèn)一答

    這篇文章主要介紹了教你怎么用java實(shí)現(xiàn)客戶端與服務(wù)器一問(wèn)一答,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • idea 普通文件夾 轉(zhuǎn)換成 module操作

    idea 普通文件夾 轉(zhuǎn)換成 module操作

    這篇文章主要介紹了idea 普通文件夾 轉(zhuǎn)換成 module操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論