ConditionalOnBean 與 ConditionalOnMissingBean 的正確玩法


  之前看到這篇博客,寫ConditionalOnClass的用法,自己實踐了一下,感覺有點問題,原文如下:

https://blog.csdn.net/lucyTheSlayer/article/details/80430912

 

於是自己更正了一下,代碼結構如下:

 

貼上完整的代碼:

程序入口:ConditionalDemoApplication:
@SpringBootApplication
public class ConditionalDemoApplication implements CommandLineRunner {
    @Autowired
    private Van van;

    public static void main(String[] args) {
        SpringApplication.run(ConditionalDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception{
        van.fight();
    }
}

Van.java

@Service
public class Van {
    @Autowired
    private Fighter fighter;

    public void fight(){
        System.out.println("van:boy next door,do you like 玩游戲");
        fighter.fight();
    }
}

Fighter.java及其實現類:

public interface Fighter {
    void fight();
}
@Service
public class Babana implements Fighter {
@Override
public void fight(){
System.out.println("Banana: 自由的氣息,蕉遲但到");
}
}
@Service
public class Billy implements Fighter {
public void fight(){
System.out.println("Billy:吾乃新日暮里的王,三界哲學的主宰。");

}
}

VanConfig:

@Configuration
public class VanConfig {
@Bean
@ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
}

@Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

1、運行程序,輸入結果如下:

 

2、如果將Billy Bean的代碼注釋掉:

@Configuration
public class VanConfig {
/*@Bean
@ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
}*/

@Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

重新運行,輸入結果如下:

 

 

3、或者,我們將Billy上的@Service注解注釋掉,讓springboot掃描不到該類:

//@Service
public class Billy implements Fighter {
    public void fight(){
        System.out.println("Billy:吾乃新日暮里的王,三界哲學的主宰。");

    }
}

同時恢復VanConfig里的配置:

@Configuration
public class VanConfig {
    @Bean
    @ConditionalOnBean(Billy.class)
    public Fighter fighter(){
        return new Billy();
    }

    @Bean
    @ConditionalOnMissingBean
    public Fighter fighter2(){
        return new Babana();
    }
}

再次運行,輸入結果如下(與第2次試驗的效果相同):

 

 

4、在第3個試驗的基礎上,我們再做一個試驗,把@ConditionalOnBean(Billy.class)注釋掉:

@Configuration
public class VanConfig {
    @Bean
//    @ConditionalOnBean(Billy.class)
    public Fighter fighter(){
        return new Billy();
    }

    @Bean
    @ConditionalOnMissingBean
    public Fighter fighter2(){
        return new Babana();
    }
}

重新運行,結果如下:

這說明,在不添加ConditionalOnBean條件時,Billy的注入已不再受任何約束的

結論:

1、@ConditionalOnBean(xxx.class)就是為了判斷 xxx.class是否存在,並已注釋了springboot容器里了;
2、@ConditionalOnMissingBean 則是在第一點不存在的情況下起作用;

當然,我們還繼續作一些測試,比如,去掉Babana上的@Service等,再看一看效果會怎樣。
好了,分享完畢,該回去干活了...


免責聲明!

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



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