高级装配 —— 条件化的 bean

如果希望一个或多个 bean 只有在应用的类路径下包含特定的库时才创建。或者希望某个 bean 只有当另外某个特定的 bean 也声明了之后才会创建。还可能要求只有某个特定的环境变量设置之后,才会创建某个 bean。

Spring 4 之前,很难实现这种级别的条件化配置,但是 Spring 4 引入了一个新的 @Conditional 注解,它可以用到带有 @Bean 注解的方法上。如果给定的条件计算结果为 true,就会创建这个 bean,否则的话,这个 bean 会被忽略

Q:如何实现条件化 bean?

A:①、条件化地配置 bean

    /**
     * 条件化地配置 bean
     * 只有设置了 magic 环境属性的时候,Spring 才会实例化这个类。
     * 如果环境中没有这个属性,那么 MagicBean 将会被忽略。
     *
     * @Conditional 将会通过 Condition 接口进行条件对比
     * 设置给 @Conditional 的类可以是任意实现了 Condition 接口的类。
     */
    @Bean
    @Conditional(MagicExistsCondition.class)
    public MagicBean magicBean(){
        return new MagicBean();
    }

②、在 Condition 中检查是否存在 magic 属性

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * 实现了 Condition 接口。
 */
public class MagicExistsCondition implements Condition{

    /**
     * @param context 通过此对象得到 Environment 对象,并使用这个对象检查环境中是否存在名为 magic 的环境属性。
     * @param metadata
     * @return 如果返回 true,则创建带有 @Conditional 注解的 bean;否则,不会创建。
     */
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        // 检查 magic 属性
        return environment.containsProperty("magic");
    }
}

matches() 方法会得到 ConditionContext 和 AnnotatedTypeMetadata 对象用来做出决策。

Q:通过 ConditionContext,我们可以做到什么?
A:做到如下几点:

  • 借助 getRegistry() 返回的 BeanDefinitionRegistry 检查 bean 定义
  • 借助 getBeanFactory() 返回的 ConfigurableListableBeanFactory 检查 bean 是否存,甚至探查 bean 的属性
  • 借助 getEnvironment() 返回的 Environment 检查环境变量是否存在以及它的值是什么
  • 读取并探查 getResourceLoader() 返回的 ResourceLoader 所加载的资源
  • 借助 getClassLoader() 返回的 ClassLoader 加载并检查类是否存在

Q:通过 AnnotatedTypeMetadata ,我们又可以做到什么?
A:能够让我们检查带有 @Bean 注解的方法上还有什么其他的注解。它也是一个接口。
借助 isAnnotated() 方法,我们能够判断带有 @Bean 注解的方法是不是还有其他特定的注解。
借助 其他的那些方法,我们能够检查 @Bean 注解的方法上其他注解的属性。

上一篇:高级装配 —— Spring profile
下一篇:高级装配 —— 如何处理自动装配的歧义性?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值