Spring4.0 新特性 -- 条件化的 Bean

2016-11-11 15:47:28   最后更新: 2016-11-11 15:47:28   访问数量:874




上一篇日志中,我们介绍了 Spring3.1 开始提供的通过配置来让 Spring 在不同的环境中创建和加载不同的 Bean

Spring3.1 新特性 -- 为不同的环境配置不同的 profile

事实上,有时我们需要更细粒度的自定义配置,只有当满足某个特定条件时才创建和加载某个 bean,比如某个 bean 依赖于另一个 bean 的创建,如果另一个 bean 没有创建,就忽略当前 bean,或者需要通过环境变量来动态控制某个 bean 是否需要被创建

 

Spring4 引入了一个新的 @Conditional 注解,他可以用在带有 @Bean 注解的方法上,只有 @Conditional 给定的条件为 true,才会创建相应的 Bean

 

@Conditional 需要传入一个 class 对象,对应的类是任何实现了 Condition 接口的类

Condition 接口:

public interface Condition { boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata); }

 

 

这个接口中只有一个方法,这个返回 boolean 类型的方法就是 @Conditional 的条件,Spring 会在准备创建 Bean 前先调用传入 class 对象的 matches 方法,从而判断是否满足创建条件,来选择创建 Bean 或忽略该 Bean 的创建

 

通过 ConditionContext 可以获取当前的运行上下文,这个接口提供了下列方法:

  1. getRegistry -- 返回 BeanDefinitionRegistry 实例,可以检查bean的定义
  2. getBeanFactory -- 返回 ConfigurableListableBeanFactory 实例,可以用来检查某个 Bean 是否存在于应用上下文中,还可以获取某个 Bean 的属性
  3. getEnvironment -- 返回 Environment 实例,用来获取环境变量的值
  4. getResourceLoader -- 返回 ResourceLoader 实例,用来得到应用加载的资源包含的内容
  5. getClassLoader -- 返回 ClassLoader 实例,用来检查某个类是否存在

 

AnnotatedTypeMetadata 接口能够让我们检查这个带有 @Bean 注解的方法上还有什么其他注解

 

上一节中,我们介绍的根据不同的环境创建和加载不同的 Bean 的 @Profile 注解在 Spring4.0 中被加以重构,在重构后,他通过一个 @Conditional 注解非常简单的得以实现

 

Profile.class

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Documented @Conditional({ProfileCondition.class}) public @interface Profile { String[] value(); }

 

 

ProfileCondition.class

class ProfileCondition implements Condition { ProfileCondition() { } public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { if(context.getEnvironment() != null) { MultiValueMap attrs = metadata.getAllAnnotationAttributes(Profile.class.getName()); if(attrs != null) { for (Object value : attrs.get("value")) { if (context.getEnvironment() .acceptsProfiles((String[]) value)) { return true; } } return false; } } return true; } }

 

 

《Spring in Action (Edition 4th)》

 






技术帖      配置      龙潭书斋      java      spring      注解      bean      profile      装配      自动装配      di      condition      环境     


京ICP备15018585号