淺談Spring條件註解@Conditional

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}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章