浅谈spring中@Conditional(条件注解)

通过@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
我要生孩子了……
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值