版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaomingyang/article/details/86639171
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}