springBoot----@ConditionalOnxxx相關注解總結


下面來介紹如何使用@Condition

 

[html]  view plain  copy
 
  1. public class TestCondition implements Condition    
  2. {    
  3.     /**   
  4.      * 只有返回true,才會啟用配置   
  5.      */    
  6.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)    
  7.     {    
  8.         return true;    
  9.     }    
  10. }  

 

 

 

@Conditional(TestCondition.class)

這句代碼可以標注在類上面,表示該類下面的所有@Bean都會啟用配置,也可以標注在方法上面,只是對該方法啟用配置。

 

spring框架還提供了很多@Condition給我們用,當然總結用語哪種好理解,看給位讀者嘍

@ConditionalOnBean(僅僅在當前上下文中存在某個對象時,才會實例化一個Bean)
@ConditionalOnClass(某個class位於類路徑上,才會實例化一個Bean)
@ConditionalOnExpression(當表達式為true的時候,才會實例化一個Bean)
@ConditionalOnMissingBean(僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean)
@ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean)
@ConditionalOnNotWebApplication(不是web應用)

后續會繼續補充

另一種總結

@ConditionalOnClass:該注解的參數對應的類必須存在,否則不解析該注解修飾的配置類;
@ConditionalOnMissingBean:該注解表示,如果存在它修飾的類的bean,則不需要再創建這個bean;可以給該注解傳入參數例如@ConditionOnMissingBean(name = "example"),這個表示如果name為“example”的bean存在,這該注解修飾的代碼塊不執行。
 
接上文
condition自定義聲明
public class InitConditional implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //判斷是否已經包含了amazonTest Bean
        Boolean bol =  conditionContext.getBeanFactory().containsBean("amazonTest");
        return bol;
    }
}

使用自定義的Conditional

@Component
@Conditional(InitConditional.class)
public class AmazonTest {

    @Autowired
    private AmazonProperties amazonProperties;

    public void testGet(){
        System.out.println("    testGet Associated");
        System.out.println(amazonProperties.getAssociateId());
    }
}

WelcomeController 與 AmazonTest關聯,使用ConditionOnBean(如果條件的bean存在,當前的bean才會被聲明)

@Component
@ConditionalOnBean(AmazonTest.class)
public class WelcomeController {
    private static final Logger logger = LoggerFactory.getLogger(WelcomeController.class);

    private AppProperties app;
    private GlobalProperties global;

    @Autowired
    public void setApp(AppProperties app) {
        this.app = app;
    }

    @Autowired
    public void setGlobal(GlobalProperties global) {
        this.global = global;
    }

    public void testWelcome(){
        String appProperties = app.toString();
        String globalProperties = global.toString();
        System.out.println(appProperties);
        System.out.println(globalProperties);
    }
}

main測試文件入口

public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext =SpringApplication.run(DemoApplication.class, args);
        //bean自動注冊,根據bean的名字獲取Bean
        AmazonProperties amazonProperties = (AmazonProperties) configurableApplicationContext.getBean("amazonProperties");
        System.out.println(amazonProperties.getAssociateId());



        Boolean aBooleanWelcomeController = configurableApplicationContext.containsBean("welcomeController");
        if(!aBooleanWelcomeController){
            System.out.println("        welcomeController init fail");
        }else{
            WelcomeController welcomeController = (WelcomeController) configurableApplicationContext.getBean("welcomeController");
            System.out.println("        welcomeController init Success");
        }


        Boolean    aBooleanAmazonTest = configurableApplicationContext.containsBeanDefinition("amazonTest");
        if(!aBooleanAmazonTest){
            System.out.println("        amazonTest init fail");
        }else{
            AmazonTest amazonTest = (AmazonTest) configurableApplicationContext.getBean("amazonTest");
            System.out.println("        amazonTest init Success");
        }
}

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM