@Conditional註解 詳細講解及示例,及相應的源碼分析

@Conditional是Spring4新提供的註解,它的作用是按照一定的條件進行判斷,滿足條件給容器註冊bean。

 

直接上代碼看效果

實例1,在沒有設置@Conditional時

配置類

@Configuration
@ComponentScan("com.lquan.condition")
public class ConditionConfig {

	//@Conditional({MacCondition.class})
	@Bean("Mac")
	public User userM(){

		return new User("Mac","系統是Mac可以這冊到容器");

	}

	//@Conditional({LinuxCondition.class})
	@Bean("linux")
	public User userL(){
		return new User("linux","系統是Mac可以註冊到容器");
	}

	@Bean("windows")
	public User userw(){
		return new User("windows","windows沒有約束");
	}

}

User類

public class User {

	private String name;

	private String desc;

	public User(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	@Override
	public String toString() {
		return "User{" +
				"name='" + name + '\'' +
				", desc='" + desc + '\'' +
				'}';
	}
}

測試類

public class TestMain {

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

		Map<String,User> map = ac.getBeansOfType(User.class);
		System.out.println(map);


	}
}

測試結果:

 

實例2,在設置@Conditional時

使用@Conditional時首先要實現對應的Condition接口

public class MacCondition implements Condition{


	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

		String name  = context.getEnvironment().getProperty("os.name");
		if(name.contains("Mac")){

			return true;
		}
		return false;
	}
}
public class LinuxCondition implements Condition{


	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		String name  = context.getEnvironment().getProperty("os.name");
		if(name.contains("linux")){
			return true;
		}
		return false;
	}
}

修改配置類

 

@Configuration
@ComponentScan("com.lquan.condition")
public class ConditionConfig {


	@Conditional({MacCondition.class})
	@Bean("Mac")
	public User userM(){

		return new User("Mac","系統是Mac可以這冊到容器");

	}


	@Conditional({LinuxCondition.class})
	@Bean("linux")
	public User userL(){

		return new User("linux","系統是Mac可以註冊到容器");

	}


	@Bean("windows")
	public User userw(){

		return new User("windows","windows沒有約束");

	}


}

 

測試結果:

 

 

結論:@Conditional註解就是一個條件判斷,只要實現的Condition接口返回的結果是true,那麼對應的註解就會生效,

本例子是利用操作系統來判斷是注入User到容器中的,我當前的運行環境是Mac ,所以會注入對應的User

 

 

 

 

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