十三、条件化的bean

条件化的bean

当你希望一个或者多个bean只有在应用的的类路径下包含特殊的库才创建。或者希望一个bean只有在只有在某个特定的bean也申明了之后才会创建。

在spring4 这很难实现,在Spring4之后,引入了一个全新的@Condition注解,它可以用到带有@Bean注解的方法上。如果计算的结果为TRUE,就会创建这个bean,否则的话,这个bean就会被忽略。

@Condition结束

@Condition的类可以是实现了Condition接口的类型,只需要提供matches()方法的实现即可。如果matches()方法返回true,就会创建带有@Condition注解的bean,否则,相反。

示例代码

package com.lf.config;

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

/**
 * Created by LF on 2017/5/1.
 */

public class MyConditional implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        boolean containsProperty = environment.containsProperty("Str");//包含str的属性
        return containsProperty;
    }
}

ConditionContext介绍

通过ConditionContext,我们可以做到以下几点:
- 借助getRegistry(),检查bean的定义
- 借助getBeanFactory(),检查bean是否存在
- getEnvironment(),返回环境变量是否存在以及,它的值是什么
- getResourceLoader(),返回所加载的资源
- getClassLoader(),加载并检查类是否存在

AnnotatedTypeMetadata介绍

  • isAnnotated(String annotationName);判断带有@bean注解的方法是不是还有其他的注解。

完整示例

创建一个服务的接口

package com.lf.service;

/**
 * Created by LF on 2017/5/1.
 */
public interface PlayService {

    void  singer();
}

服务的实现

package com.lf.service.impl;

import com.lf.config.MyConditional;
import com.lf.service.PlayService;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Component;

/**
 * Created by LF on 2017/5/1.
 */
@Conditional(MyConditional.class)
@Component
public class PlayServiceImpl implements PlayService {
    @Override
    public void singer() {
        System.err.println("唱歌");
    }
}

条件注解

package com.lf.config;

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

/**
 * Created by LF on 2017/5/1.
 */

public class MyConditional implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        boolean containsProperty = environment.containsProperty("Str");//包含str的属性
        return containsProperty;
    }
}

只有当环境变量中存在Str的变量的时候,才会创建PlayServiceImpl

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值