基於Spring的@Conditional註解進行條件加載

0x01:@Conditional使用

Spring Boot的強大之處在於使用了Spring 4框架的新特性:@Conditional註釋,此註釋使得只有在特定條件滿足時才啟用一些配置。

下面來介紹如何使用Condition

<code>package com.demo.spring;  

import org.springframework.context.annotation.Condition;  
import org.springframework.context.annotation.ConditionContext;  
import org.springframework.core.type.AnnotatedTypeMetadata;  

public class MyCondition implements Condition  {  

    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)  
    {  
        //TODO 這裡寫自己的邏輯,只有返回true,才會啟用配置
        return true;  
    }  
}  /<code>

接下來就可以使用了

<code>package com.demo.spring;  

import java.io.Serializable;  

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Conditional;  
import org.springframework.context.annotation.Configuration;  

@Configuration  
@Conditional(MyCondition.class)  
public class Config  
{  
    @Bean  
    public Serializable createSerializable()  
    {  
        System.out.println("======000======");  
        return "";  
    }  
} /<code>

@Conditional(MyCondition.class)這句代碼可以標註在類上面,表示該類下面的所有@Bean都會啟用配置;也可以標註在方法上面,只是對該方法啟用配置。


0x02:@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時觸發實例化。


分享到:


相關文章: