spring boot-高级话题之@Conditional(条件注解)(3)

本文介绍 Spring Boot 中如何使用 @Conditional 进行条件化的 Bean 创建。通过实现 Condition 接口并重写 matches 方法,可以根据不同的操作系统(如 Windows 或 Linux)创建对应的 ListService Bean。这种机制适用于依赖于特定 jar 包或者需要根据特定 Bean 的存在与否来决定是否创建另一个 Bean 的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在spring boot之@Profile模拟开发环境灵活配置(5)中通过活动的profile,可以获取到不同bean。
 @Conditional:
 满足某一个特定条件创建指定的一个Bean或多个Bean(根据特定条件来控制Bean的创建)
 使用场景:
 1.当某一个jar包在某个类路径下,自动装配一个Bean或多个Bean;
 2.只有某个bean创建时,才会创建另一个bean。

 实例:通过实现Condition接口并重写matches方法来构造判断条件,若w7系统输出w7,若linux 输出lx

1.//判定条件

package com.zh.ch3.conditional;

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

public class WindowsCondition implements Condition {
	//判定windows的条件
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return context.getEnvironment().getProperty("os.name").contains("Windows");
	}

}
package com.zh.ch3.conditional;

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

public class LinuxCondition implements Condition {
	//判定linux的条件
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return context.getEnvironment().getProperty("os.name").contains("Linux");
	}

}

抽象接口:

package com.zh.ch3.conditional;

public interface ListService {
	public String showListCmd();
}
根据指定的条件创建指定的bean

package com.zh.ch3.conditional;

//linux下所要创建的Bean的类
public class LinuxListService implements ListService{

	@Override
	public String showListCmd() {
		return "lx";
	}

}
package com.zh.ch3.conditional;

//windows下所要创建的Bean的类
public class WindowsListService implements ListService {

	@Override
	public String showListCmd() {
		return "w7";
	}

}
config配置

package com.zh.ch3.conditional;

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

@Configuration
public class ConditionConifg {
	@Bean
    @Conditional(WindowsCondition.class) //1@Conditional,符合windows条件则实例化windowsListService
    public ListService windowsListService() {
        return new WindowsListService();
    }

    @Bean
    @Conditional(LinuxCondition.class) //2@Conditional,符合linux条件则实例化linuxListService
    public ListService linuxListService() {
        return new LinuxListService();
    }

}
测试类

package com.zh.ch3.conditional;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConifg.class);

		ListService listService = context.getBean(ListService.class);

		System.out.println(context.getEnvironment().getProperty("os.name") + "——输出的命令为: " + listService.showListCmd());

		context.close();
	}
}
结果:Windows 7——输出的命令为: w7(w7环境下!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值