@Conditional为按照条件配置spring的bean提供了支持,即满足某种条件下,怎么配置对应的bean;例如某一个jar包在classpath中的时候,配置某几个bean,又或者当某一个bean配置好后,会自动配置一个特定的bean ,或者当某种环境变量被设置后,创建某个bean。
这里先做一个JAVAEE颠覆者--Spring boot 实战中的提供思路的小例子。
先定义一个computer的接口,这里不是使用@Conditional注解的需要的必要步骤,只是为了后面抽象和实现的方便调用。
package com.wzh.config;
public interface Computer {
public String price();
}
这一步还是准备工作,做一些抽象,实现的步骤
package com.wzh.config;
public class SysWin implements Computer{
public SysWin() {
super();
//System.out.println(this.price());
}
@Override
public String price()
{
Contants.computerPrice = "7000";
return "当前操作系统:" + Contants.system + " 电脑价格" + Contants.computerPrice;
}
}
package com.wzh.config;
public class SysMac implements Computer{
public SysMac() {
super();
//System.out.println(this.price());
}
public String price()
{
Contants.computerPrice = "10000";
return "当前操作系统:" + Contants.system + " 电脑价格" + Contants.computerPrice;
}
}
package com.wzh.config;
public class Contants {
/**
* 操作系统类型
*/
public static String system = "";
public static String computerPrice ="";
}
准备工作做完了,现在是做条件装配bean的必要步骤了,实现Condition接口,并实现matches()方法,如果matches方法返回true,那么带有@Conditional注解的bean就会装载,false就不会装载
package com.wzh.config.condition;
import com.wzh.config.Contants;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* 条件条件初始化bean测试
*/
public class SysWinCondition implements Condition{
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata)
{
//获取上下文环境对象,可以对某些配置做操作
Environment env = conditionContext.getEnvironment();
Contants.system = env.getProperty("os.name");
//return true;
return env.getProperty("os.name").contains("Windows");
}
}
package com.wzh.config.condition;
import com.wzh.config.Contants;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* 条件条件初始化bean测试
*/
public class SysMacCondition implements Condition{
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata)
{
//获取上下文环境对象,可以对某些配置做操作
Environment env = conditionContext.getEnvironment();
Contants.system = env.getProperty("os.name");
//return false;
return env.getProperty("os.name").contains("Mac OS X");
}
}
我们看到我们用ConditionContext获取到上下文,做了某些操作。除了最基本的还有其他的操作
这个在Spring 实战第四版 75页到78页有介绍。
这里我们就只是做最简单的操作。
下面我们写个配置类,这里因为使用的boot,提倡去xml,所以用配置类
package com.wzh.config;
import com.wzh.config.condition.SysMacCondition;
import com.wzh.config.condition.SysWinCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SysConfig {
@Bean
@Conditional(SysWinCondition.class)
public Computer sysWin()
{
return new SysWin();
}
@Bean
@Conditional(SysMacCondition.class)
public Computer sysMac()
{
return new SysMac();
}
}
写个service去调用下,看下会装配那个Bean
package com.wzh.demo.service.impl;
import com.wzh.config.Computer;
import com.wzh.demo.service.ConditionService;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("conditionService")
public class ConditionServiceImpl implements ConditionService {
/**
* 上下文对象
*/
@Resource
private ApplicationContext applicationContext;
@Override
public void computerPrice() {
Computer com = applicationContext.getBean(Computer.class);
System.out.println(com.price());
}
}
junit测试类
import base.BaseJunit;
import com.wzh.demo.service.ConditionService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class conditonTest extends BaseJunit {
@Autowired
@Qualifier(value = "conditionService")
private ConditionService service;
@Test
public void test()
{
service.computerPrice();
}
}
因为我这里是MAC 系统,很明显,看到获取到的实例是mac的,就实现了条件话装配。这个注解虽然不常用,不过在某些特定的场景还是会很有用