通过@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
我要生孩子了……
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐