`
wiselyman
  • 浏览: 2094336 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82373
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130816
社区版块
存档分类
最新评论

Spring4.0系列5-@Conditional

 
阅读更多

Spring4.0系列1-新特性

Spring4.0系列2-环境搭建

Spring4.0系列3-@RestController

Spring4.0系列4-Meta Annotation(元注解)

Spring4.0系列5-@Conditional 

Spring4.0系列6-Generic Qualifier(泛型限定)

Spring4.0系列7-Ordering Autowired Collections

Spring4.0系列8-Groovy DSL

Spring4.0系列9-websocket简单应用

更多正在编写中。。。

 

这篇文章介绍Spring 4的@Conditional注解。在Spring的早期版本你可以通过以下方法来处理条件问题:

  • 3.1之前的版本,使用Spring Expression Language(SPEL)。
  • 3.1版本有个新特性叫profile,用来解决条件问题。

1、Spring Expression Language(SPEL)

SPEL有一个三元运算符(if-then-else)可以在配置文件中当作条件语句,如下:

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

 testBean的prop动态依赖于flag的值。

2、使用Profile

<!-- 如果没有设置profile,default.xml将被加载 -->
<!-- 必须放置在配置文件的最底下,后面再也没有bean的定义 -->
<beans profile="default">
     <import resource="classpath:default.xml" />
</beans>
<!-- some other profile -->
<beans profile="otherProfile">
    <import resource="classpath:other-profile.xml" />
</beans>

 

3、使用@Conditional

官方文档定义:“Indicates that a component is only eligible for registration when all specified conditions match”,意思是只有满足一些列条件之后创建一个bean。

@Conditional定义

 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE, ElementType.METHOD)
 public @interface Conditional{
Class <!--?extends Condition-->[] value();
 }

 

@Conditional注解主要用在以下位置:
  • 类级别可以放在注标识有@Component(包含@Configuration)的类上
  • 作为一个meta-annotation,组成自定义注解
  • 方法级别可以放在标识由@Bean的方法上

如果一个@Configuration的类标记了@Conditional,所有标识了@Bean的方法和@Import注解导入的相关类将遵从这些条件。

 

condition接口定义如下:

 

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);
}

 

下面看一个例子:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
public class LinuxCondition implements Condition{
 
  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Linux");  }
}

 

import org.springframework.context.annotation.Condition; 
import org.springframework.context.annotation.ConditionContext; 
import org.springframework.core.type.AnnotatedTypeMetadata; 
 
public class WindowsCondition implements Condition{
 
  @Override 
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Windows");
  }
}

 

我们有两个类LinuxCondition 和WindowsCondition 。两个类都实现了Condtin接口,重载的方法返回一个基于操作系统类型的布尔值。

 

下面我们定义两个bean,一个符合条件另外一个不符合条件:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MyConfiguration {
 
  @Bean(name="emailerService")
  @Conditional(WindowsCondition.class)
  public EmailService windowsEmailerService(){
      return new WindowsEmailService();
  }
 
  @Bean(name="emailerService")
  @Conditional(LinuxCondition.class)
  public EmailService linuxEmailerService(){
    return new LinuxEmailService();
  }
}

 

 当符合某一个条件的时候,这里的@Bean才会被初始化。 

 

新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。

 

京东地址:http://item.jd.com/11894632.html

当当地址:http://product.dangdang.com/23926195.html

亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6 

淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail

 

或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。

 


分享到:
评论
2 楼 wiselyman 2014-03-19  
userapplewings 写道
如果我调用MyConfiguration的linuxEmailerService()方法时,而我的系统是windows,那么他能自动转去调用windowsEmailerService()? 这个意思?

不是你调linuxEmailerService而是调 emailerService
1 楼 userapplewings 2014-03-15  
如果我调用MyConfiguration的linuxEmailerService()方法时,而我的系统是windows,那么他能自动转去调用windowsEmailerService()? 这个意思?

相关推荐

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

    在Spring 4.0中,`@Conditional`注解是一个重要的新特性,它极大地增强了Spring框架的灵活性和可配置性。这个注解允许我们在运行时根据特定条件决定是否注册一个bean。这使得开发者可以根据环境、配置或其他运行时...

    spring4.0 Conditional在满足特定条件下,才会实例化对象.docx

    Spring 4.0 引入了@Conditional注解,它提供了一种更加灵活的方式来决定何时实例化一个对象,根据特定的条件。这个功能使得我们能够更精细化地控制Spring容器中的bean装配,仅在满足特定条件时才创建和注册bean。 ...

    Spring4.0的jar包,官方源码,javadoc

    Spring4.0版本在之前的基础上做了很多改进和优化,为开发者提供了更强大的功能和更好的性能。这个压缩包包含了Spring4.0的官方源码和Javadoc文档,这对于深入理解Spring的工作原理和API使用具有极高的价值。 首先,...

    浅谈SpringBoot中的@Conditional注解的使用

    @Conditional 注解是 Spring 4.0 之后出的一个非常有用的注解,主要用于根据具体的条件决定是否创建 Bean 到 Spring 容器中。下面我们来详细介绍 @Conditional 注解的使用。 @Conditional 注解的作用 @Conditional...

    fast-spring-boot-源码.rar

    Spring Boot是由Pivotal团队提供的全新框架,它基于Spring 4.0设计,旨在简化Spring应用的初始搭建以及开发过程。Spring Boot的核心特性包括:提供一个默认的、无需过多配置的运行环境;集成了大量的可以通过Java @...

    spring配置基于注解1

    `@Conditional`注解是Spring 4.0引入的一个强大功能,它允许我们根据某些条件决定是否将bean注册到Spring容器中。条件可以基于环境变量、系统属性、bean的存在等。例如,我们可以创建一个`@Conditional`注解的类,...

    spring-framework-4.0.6.RELEASE

    首先,Spring 4.0引入了对Java 8的全面支持,这意味着开发者可以充分利用Java 8的新特性,如lambda表达式、日期和时间API以及流API等,提升代码的简洁性和可读性。同时,Spring 4也对Groovy的支持进行了优化,使得...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    1.4.3. What’s new in Spring 4.0? 1.5. Summary Chapter 2. Wiring beans 2.1. Exploring Spring’s configuration options 2.2. Automatically wiring beans 2.2.1. Creating discoverable beans 2.2.2. Naming a...

    spring in action 中文版带书签第三部分

    - **Profile支持**:Spring 4.0引入了Profile的概念,允许开发者在不同的环境中配置不同的Bean。例如,在开发环境、测试环境和生产环境中可以有不同的数据库连接配置。 - **条件化Bean配置**:通过`@Conditional`...

    springboot注解.docx

    Spring 4.0引入的注解,基于条件的Bean或配置。如果满足特定条件,才会将Bean或配置加载到Spring容器中。 7. **@ConditionalOnBean**: 如果Spring容器中已经存在指定的Bean,则条件满足,配置生效。 8. **@...

    JavaEE开发的颠覆者+Spring+Boot实战++完整版

    5 1.3 Spring 基础配置 .....................................17 第2 章 Spring 常用配置 .... ......................... ... 30 2.1 Bean 的Scope .... ................................... 30 2.2 Spring EL ...

    springboot-vertx-mybits

    标题 "springboot-vertx-mybits" 暗示我们正在处理一个基于Spring Boot和Vert.x框架的项目,可能是一个微服务应用。描述中的“测试地址”表明这可能是一个用于测试目的的应用,而“待解决问题”揭示了开发过程中遇到...

    SpringBoot高级特性-自动装配&自定义starter

    Condition是Spring在4.0引入的条件判断功能,Spring根据这个功能选择性的创建Bean。 下面我们使用SpringDataRedis 来演示一下 案例 创建SpringBoot工程,引入springboot基础设施依赖 org.springframework.boot

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

Global site tag (gtag.js) - Google Analytics