欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring 4.0新功能:@Conditional注解详细介绍

程序员文章站 2024-02-25 19:51:57
前言 最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@conditional注解。在之前的spring版本中,你处理cond...

前言

最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@conditional注解。在之前的spring版本中,你处理conditions只有以下两个方法:

  • 在3.1版本之前,你需要使用spring expression language
  • 在3.1版本发布时,profiles被引入来处理conditions。

让我们分别看看以上两者,在来理解spring 4带来的@conditional注解。

spring expression language(spel)

spel的三元标识符(if-then-else)可以在spring配置文件中用来表达条件语句。

<bean id="flag">
 <constructor-arg value="#{systemproperties['system.propery.flag'] ?: false }" />
</bean>
<bean id="bean">
 <property name="property" value="#{ flag ? 'yes' : 'no' }"/>
</bean>

这个bean的属性依赖于flag的值,该值是使用外部属性注入的,这样bean就具有了动态的能力。

使用 profiles

这是在spring 3.1引入的。像下面这样使用。

<!-- default configuration - will be loaded if no profile is specified -->
<!-- this will only work if it's put at the end of the configuration file -->
<!-- so no bean definitions after that -->
<beans profile="default">
  <import resource="classpath:default.xml" />
</beans>
<!-- some other profile -->
<beans profile="otherprofile">
 <import resource="classpath:other-profile.xml" />
</beans>

使用spring 4的@conditional注解

现在介绍@conditional注解。官方文档的说明是“只有当所有指定的条件都满足是,组件才可以注册”。主要的用处是在创建bean时增加一系列限制条件。

conditional接口的声明如下:

@retention(retentionpolicy.runtime)
@target(elementtype.type, elementtype.method)
public @interface conditional{
 class <!--?extends condition-->[] value();
}

所以@conditional注解使用方法如下

  • 类型级别,可以在@component 或是 @configuration类上使用
  • 原型级别,可以用在其他自定义的注解上
  • 方法级别,可以用在@bean的方法上

如果一个@configuration类使用了@conditional,会影响所有@bean方法和@import关联类

public interface condition{
/** determine if the condition matches.
* @param context the condition context
* @param metadata meta-data of the {@link annotationmetadata class} or
* {@link method method} being checked.
* @return {@code true} if the condition matches and the component can be registered
* or {@code false} to veto registration.
*/
boolean matches(conditioncontext context, annotatedtypemedata metadata);
}

下面是一个例子

public class systempropertycondition implements condition {
 @override
 public boolean matches(conditioncontext context, annotatedtypemetadata   metadata) {
  return (system.getproperty("flag") != null);
 }
}

class systempropertyabsentcondition implements condition {
 @override
 public boolean matches(conditioncontext context, annotatedtypemetadata metadata) {
  return (system.getproperty("flag") == null);
 }
}

这里我们有两个类:systempropertycondition和systempropertyabsentcondtion. 这两个类都实现了condition接口.覆盖的方法基于属性flag返回一个布尔值。

现在我们定义两个类,一个是positive条件,一个是negative条件:

@bean
@conditional(systempropertycondition.class)
public sampleservice service1() {
 return new sampleserviceimpl1();
}

@bean
@conditional(systempropertyabsentcondition.class)
public sampleservice service2() {
 return new sampleserviceimpl2();
}

上面提到的profiles已经通过conditional原型注解进行了修改。

总结

本文介绍了spring 4的conditianal注解。注意condition注解是不会继承的。如果一个父类使用了conditional注解,其子类是不会拥有conditions的。如果你动手尝试以上的例子,会帮助你获得更好的理解。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。