@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

 

 

 

 

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