浅谈Spring条件注解@Conditional

本文详细解析了Spring框架中@Conditional注解的使用方法,包括注解的基本语法、如何通过自定义条件类来控制Bean的注入,以及示例代码演示。通过条件注解,开发者可以在运行时根据不同的条件动态决定是否将某个Bean加载到Spring容器中。

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

1.注解源码解读
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
	Class<? extends Condition>[] value();
}
  • 注解可以作用在方法、类上
  • 注解可以根据代码中设置的条件去装载不同的Bean
  • 注解需要传入一个Class数组,数组中的类需要实现org.springframework.context.annotation.Condition接口
  • Condition是一个接口,需要实现matches方法,返回true注入Bean,返回false不注入Bean
2.创建一个Persion类
package com.eureka.client.co;

public class Person {
	private String skinColor;
	
	public Person(String skinColor) {
		this.skinColor = skinColor;
	}
	public String getSkinColor() {
		return "我的皮肤是:"+this.skinColor;
	}

	public void setSkinColor(String skinColor) {
		this.skinColor = skinColor;
	}

}

3.创建注解判断条件类WhiteCondition和YellowCondition,两个类都实现Condition接口

WhiteCondition的条件类

package com.eureka.client.condition;

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

public class WhiteCondition implements Condition{

	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return true;
	}


}

YellowCondition的条件类

package com.eureka.client.condition;

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

public class YellowCondition implements Condition{

	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return false;
	}

}
4.创建BeanConfig类,用于配置WhitePersion和YellowPersion实例并根据判断条件注入Spring容器中

将注解配置在方法上

package com.eureka.client.config;

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

import com.eureka.client.co.Person;
import com.eureka.client.condition.WhiteCondition;
import com.eureka.client.condition.YellowCondition;

@Configuration
public class BeanConfig {
	
	@Bean("white")
	@Conditional(WhiteCondition.class)
	public Person getWhitePersion() {
		return new Person("白色");
	}
	
	@Bean(name="yellow")
	@Conditional(YellowCondition.class)
	//如果条件配置类返回true,则将对应的类加载如SpringIOC容器,否则不加载
	public Person getYellowPersion() {
		return new Person("黄色");
	}
}

将注解配置在类上

package com.eureka.client.config;

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

import com.eureka.client.co.Person;
import com.eureka.client.condition.WhiteCondition;
import com.eureka.client.condition.YellowCondition;

@Configuration
@Conditional(WhiteCondition.class)
public class BeanConfig {
	
	@Bean("white")
//	@Conditional(WhiteCondition.class)
	public Person getWhitePersion() {
		return new Person("白色");
	}
	
	@Bean(name="yellow")
//	@Conditional(YellowCondition.class)
	//如果条件配置类返回true,则将对应的类加载如SpringIOC容器,否则不加载
	public Person getYellowPersion() {
		return new Person("黄色");
	}
}

5.主类,启动应用上下文,如果注解条件配置类返回true,则将对应的类加载到SpringIOC容器,否则不加载
package com.eureka.client;

import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

import com.eureka.client.co.Person;

@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(EurekaClientApplication.class, args);
		Map<String, Person> person = context.getBeansOfType(Person.class);
		System.out.println(person);
	}

}

条件注解作用在方法上输出结果是:

{white=com.eureka.client.co.Person@71dd4624}

条件注解作用在类上输出结果是:

{white=com.eureka.client.co.Person@668a32a4, yellow=com.eureka.client.co.Person@2026fbff}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值