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

Spring的新引入的注解

@ConditionalOnClass
是Springboot实现自动配置的重要支撑之一。其用途是判断当前classpath下是否存在指定类,若是则将当前的配置装载入spring容器。举例来说,如果在maven中引入了velocity,那么视图就使用velocity,若引入的是freemarker,则使用freemarker.

但是眼见为虚,手敲为实,所以自己决定来验证下其使用。

场景设在新日暮里,主角是van,是一个喜爱摔跤的格斗爱好者,他将向新日暮里的其他选手发起友谊比赛。这里,有两位新日暮里的强者,一位是新日暮里王,billy;另一位来自自由的大美利坚,香蕉君banana。van急于找人摔跤,因此只要有人在,他就发起挑战。

用intellj新建个springboot工程,目录如下:

入口类:
package com.ff.fun;
import com.ff.fun.player.Van;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class SbfunApplication implements CommandLineRunner{
 
    @Autowired
    private Van van;
 
    public static void main(String[] args) {
        SpringApplication.run(SbfunApplication.class, args);
    }
 
    @Override
    public void run(String... args) throws Exception {
        //do something
        van.fight();
    }
}
没什么好多说的,我们的主角Van开始了格斗。

主角Van:
package com.ff.fun.player;
 
import com.ff.fun.fighter.Fighter;
 
public class Van {
 
    private Fighter fighter;
 
    public Van(Fighter fighter) {
        this.fighter = fighter;
    }
 
    public void fight(){
        System.out.println("van:boy next door,do you like 玩游戏");
        fighter.fight();
    }
}
新日暮里格斗家们:
package com.ff.fun.fighter;
 
public interface Fighter {
 
    void fight();
}
package com.ff.fun.fighter;
 
public class Banana implements Fighter {
    @Override
    public void fight() {
        System.out.println("banana:自由的气息,蕉迟但到");
    }
}
package com.ff.fun.fighter;
 
public class Billy implements Fighter{
 
    @Override
    public void fight(){
        System.out.println("billy:吾乃新日暮里的王,三界哲学的主宰。");
    }
}

Config:
package com.ff.fun.config;
 
import com.ff.fun.player.Van;
import com.ff.fun.fighter.Billy;
import com.ff.fun.fighter.Fighter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ConditionalOnClass({Billy.class})
public class VanConfig {
 
    @Bean
    public Fighter billy(){
        return new Billy();
    }
 
    @Bean
    public Van van(){
        return new Van(billy());
    }
}
package com.ff.fun.config;
 
import com.ff.fun.player.Van;
import com.ff.fun.fighter.Banana;
import com.ff.fun.fighter.Fighter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ConditionalOnClass({Banana.class})
public class Van2Config {
    @Bean
    public Fighter banana(){
        return new Banana();
    }
 
    @Bean
    public Van van(){
        return new Van(banana());
    }
}
这就是重点了,这两个带条件的配置类,一个是当Billy在的时候启用,一个是在当Banana在的时候启用

试验环节:
编译后,在target中,可见

这两个类,这时候如果直接执行程序,会输出:
van:boy next door,do you like 玩游戏
billy:吾乃新日暮里的王,三界哲学的主宰。
说明,当候选类都在的情况下,spring会挑其中之一(至于如何选择的得另行研究);

这时候,删掉Billy.class,让吾王下线,新日暮里就只剩下Banana一个哲学战士了,此时,再次运行,输出为:

van:boy next door,do you like 玩游戏
banana:自由的气息,蕉迟但到
可以看到,billy的配置没有加载,van的对手是banana,@ConditionalOnClass这个注解起到了选择Config的作用。

此时,如果将香蕉君也删掉,新日暮里空无一人(⊙︿⊙),此时运行结果为:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field van in com.ff.fun.SbfunApplication required a bean of type 'com.ff.fun.player.Van' that could not be found.
    - Bean method 'van' not loaded because @ConditionalOnClass did not find required class 'com.ff.fun.fighter.Banana'
    - Bean method 'van' not loaded because @ConditionalOnClass did not find required class 'com.ff.fun.fighter.Billy'

Action:

Consider revisiting the conditions above or defining a bean of type 'com.ff.fun.player.Van' in your configuration.
意料之中,报错了,一切符合预期。
--------------------- 
作者:放开那禽兽冲我来 
来源:CSDN 
原文:https://blog.csdn.net/lucyTheSlayer/article/details/80430912 
版权声明:本文为博主原创文章,转载请附上博文链接!

@ConditionalOnClass的使用探索 新日暮里格斗大会相关推荐

  1. 布局元宇宙,探索新未来——WEB3.0·重庆站圆满落幕

    2023年3月25日,由CyberDao市场发展部主导的"WEB3.0·元宇宙峰会-重庆站"在重庆圆满落幕. 本次峰会以"布局元宇宙,探索新未来"为主题,围绕C ...

  2. R探索新数据分析(Exploratory Data Analysis,EDA)

    R探索新数据分析(Exploratory Data Analysis,EDA) 目录 R探索新数据分析(Exploratory Data Analysis,EDA) str方法进行数据概览及类型查看

  3. 沙龙报名 | 探索新零售时代的数字化创新

    沙龙报名 | 探索新零售时代的数字化创新 互联网技术正在重塑新零售的消费场景,使顾客消费思维发生改变.消费习惯由价格时代转为价值时代.同时,体验需求得到升级.新零售在"人.货.场" ...

  4. 精准扶贫探索新融合模式-农业大健康·李龙:谋定乡村振兴

    精准扶贫探索新融合模式-农业大健康·李龙:谋定乡村振兴 华夏时报 记者王晓慧 北京报道 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万赢信采编:&quo ...

  5. delphi dbgrid 焦点 行号_安庆东进北扩发展超乎想象,谁会成为城市新格局里的人居焦点?...

    原标题:安庆东进北扩发展超乎想象,谁会成为城市新格局里的人居焦点? 一个城市的规划所向,即是发展所向.自安庆推出" 东进北扩"战略政策后,东部新城和北部新城的发展得到了全市市民的见 ...

  6. neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集

    neo4j数据浏览器 在查看新的Neo4j数据库时,我发现遇到的一件困难就是确定其中包含的数据的结构. 我习惯于关系数据库,在该数据库中您可以轻松获取表列表和外键,以便您将它们相互连接. 传统上,使用 ...

  7. Neo4j:在Neo4j浏览器的帮助下探索新数据集

    当我查看一个新的Neo4j数据库时,发现困难之一是确定其中包含的数据的结构. 我习惯于关系数据库,在该数据库中您可以轻松地获取表列表和外键,从而使它们彼此连接. 传统上,使用Neo4j时很难做到这一点 ...

  8. “苏宁秒送”,苏宁易购探索新零售的有力武器

    7月30日,在818发烧购物节上,苏宁易购发布即时配送解决方案"苏宁秒达",将主要为3公里社区生活提供30分钟到达甚至更快的配送服务,以及预约时间精准送达的定时达服务.同时,包括苏 ...

  9. 中科院计算所陈云霁:深度学习芯片剩下的只是工程问题,我们要起航探索新方向

    2019-11-11 15:12 导语:四个层面~ 陈云霁,是一个80后,但却是智能芯片研究的领军人物. 在9月中旬,北京智源人工智能研究院曾举办"智能体系架构与芯片"重大研究方向 ...

最新文章

  1. 工作5年左右的程序员如何在职业瓶颈期内快速提升自己的身价?提升后如何有效变现自己的高质量技能?...
  2. 对象化下的编程——字段
  3. 7限制cpu使用_Kubernetes 资源配额使用指南 | Linux 中国
  4. 【简便解法】1083 是否存在相等的差 (20分)_14行代码AC
  5. ASP.NET Core 之 Identity 入门(三)
  6. 中blur函数_Comonad在图像处理中的应用
  7. 利用Flash读取SQL Server数据库的值
  8. 使用 custom element 创建自定义元素
  9. Core Animation基础
  10. 电脑注册表怎么清理_笔记本电脑维修|笔记本电脑屏幕怎么清理
  11. @Transactional +自定义注解不生效_SpringBoot之路(三)SpringDataJpa中常用注解的使用...
  12. Puppet的安装部署
  13. 记录学习WeakReference发现的问题
  14. 迁移学习——数据不够的情况下训练深度学习模型
  15. HTML 列表 olullidldtdd
  16. poj 3683 2-SAT入门
  17. 5星好书———电子技术基础数字部分(第6版)
  18. win10计算机变成了英文,win10变成英文【处理方式】
  19. 中兴威武3android驱动,中兴威武3
  20. 征文分享|OceanBase 对分布式事务的支持能力评测与分析

热门文章

  1. 如何拉长背景(每天一个PS小项目)
  2. 【Vue2.0学习】—插槽(六十四)
  3. [数分笔记]Dedekind切割定理的证明
  4. iOS - Share 分享/第三方登录
  5. ChatGPT角色扮演咒语库(内有插件推荐)
  6. 值得科普的Touch Bar实用小技巧
  7. mb63.net ios.html,魔童捉妖记ios版
  8. 微软提出CoDi:开创性多模态扩散生成模型,实现4种模态任意输入输出
  9. JavaScript系列之Promise的resolve、reject、then、catch
  10. windows防火墙设置允许FTP命令传输