浅谈spring中@Conditional(条件注解)
通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件,下面通过代码演示。演示之前先说下,示例先创建一个接口,然后创建两个实现该接口的类,通过条件注解去实现在容器中到底装载哪个实现类,即在spring容器中装载那个bean。1、创建服务接口在该示例接口中,创建一个人的
·
通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件,下面通过代码演示。演示之前先说下,示例先创建一个接口,然后创建两个实现该接口的类,通过条件注解去实现在容器中到底装载哪个实现类,即在spring容器中装载那个bean。
1、创建服务接口
在该示例接口中,创建一个人的接口,并创建一个服务方法,然后通过该接口分别实现一个男人和一个女人的实现类,通过注解去判断装载的bean。接口代码为:
package com.spring.conditional.annotation;
//一个服务接口
public interface Person {
void birth();
}
2、接口实现类
下面分别实现一个男人和一个女人的实现类。
男人的实现方类:
package com.spring.conditional.annotation;
public class Man implements Person {
@Override
public void birth() {
System.out.println("我不会生孩子……");
}
}
女人的实现类为:
package com.spring.conditional.annotation;
public class Woman implements Person {
@Override
public void birth() {
System.out.println("我要生孩子了……");
}
}
3、创建Man和Woman的判断条件类
Man的条件类
package com.spring.conditional.annotation;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class ManCondition implements Condition {
@Override
public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
return false;
}
}
Woman的条件类
package com.spring.conditional.annotation;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WomanCondition implements Condition {
@Override
public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
return true;
}
}
4、创建配置类
package com.spring.conditional.annotation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class ConditionalConfig {
@Bean
@Conditional(ManCondition.class)
//如果ManCondition中的match方法返回结果true,就创建该Bean,否则不创建
public Man getMan(){
return new Man();
}
@Bean
@Conditional(WomanCondition.class)
public Woman getWoman(){
return new Woman();
}
}
5、创建测试方法
package com.spring.conditional.annotation;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConditionalConfig.class);
Person person = ctx.getBean(Person.class);
//通过条件类判断,只有Woman的条件类返回true,所以在容器中只能找到Woman的实现类的装载bean,而Woman又是继承自Person的,所以,在容器中可以找到一个唯一的Bean,通过getBean获取到。
System.out.println(person);
person.birth();
}
}
输出结果为:
com.spring.conditional.annotation.Woman@75881071
我要生孩子了……
更多推荐
已为社区贡献9条内容
所有评论(0)