@ConditionalOnClass的使用探索 新日暮里格斗大会

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.

意料之中,报错了,一切符合预期。



  • 18
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
市面上有许多外观设计优雅、性能出色的电动自行车品牌和型号,以下是一些受欢迎的选择: 1. **小牛电动**:小牛电动以其创的外观设计和丰富的配件而受到年轻人的喜爱。它的车型通常具有现代化的造型和智能化的功能,是追求时尚和个性化的消费者的理想选择。 2. **九号电动**:九号电动车以“真智能”为标签,注重技术创,例如九号电动Fz MIX拥有超大空间踏板、五级可调后避震等领先技术,以及高可玩性的个性化音效和智能骑行辅助功能。 3. **绿源电动车**:绿源电动车提供多种颜色选择,并与国际流行色协会合作,每年发布四个季节相应的电动车流行色。此外,绿源还与哆啦A梦、皮卡丘、HelloKitty等品牌合作,提供跨界二次元合作的电动车款式。 4. **雅迪**:雅迪是中国知名的电动车品牌,提供多款电动车型,其中雅迪de2是一款性价比高的车型,虽然外观可能不如其他几款出色,但续航能力强,是实用型消费者的选择。 5. **日**:日XC1是一款颜值高且符合国标的电动车款式,适合城市通勤使用。 在选择电动自行车时,您应该考虑以下几个因素: 1. **续航能力**:电池的容量决定了电动车的续航程,一般以安培小时(Ah)表示。 2. **动力性能**:电机的功率会影响电动车的爬坡能力和速度。 3. **安全性能**:包括刹车系统、灯光照明等安全配置。 4. **舒适性**:座椅舒适度、减震效果等都会影响骑行体验。 5. **价格**:根据您的预算选择性价比高的车型。 总之,建议您在购买前,可以到实体店试骑或查看网上的用户评价,以便更好地了解车辆的实际表现和骑行感受。同时,考虑到售后服务和保养维护的便利性,选择一个有良好服务网络的品牌也很重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值