摘要:
在实际项目开发中,可能需要根据不同的条件来创建同一个接口下的不同的bean实例对象,类似于我们项目中有开发环境、测试环境进而实现一些文件的不同环境下的自动切换。根据不同的条件来创建同一个接口下的不同的bean实例对象可以使用spring中的@Conditional注解来实现。
@Conditional可以根据某一个指定的条件创建bean实例对象,比如当一个jar包存在于指定的类路径下,自动装配bean。总的来说一句话,根据不同的条件控制bean实例对象的创建。
在spring boot中会大量的用到该特性。
下面的实例使用场景如下:
比如windows系统与linux系统中显示文件的命令是不同的,windows中的命令为”dir“,linux为”ls“。
下面我们开始实现
1条件的定义
1.1判断windows系统的类
public class WinCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment();//获取环境变量 String osName = environment.getProperty("os.name");//获取os.name return osName.contains("Windows"); } }
1.2判断linux系统的类
public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment();//获取环境变量 String osName = environment.getProperty("os.name");//获取os.name return osName.contains("Linux"); } }
2不同系统下的获取命令类
2.1接口定义
public interface CmdService { public String showListCmd();//获取显示文件的方法 }
2.2 windows命令类
public class WinCmd implements CmdService{ @Override public String showListCmd() { return "dir"; } }
2.3 linux命令类
public class LinuxCmd implements CmdService{ @Override public String showListCmd() { return "ls"; } }
3 配置类
@Configuration public class ShareniuConfig { @Bean @Conditional(WinCondition.class) public CmdService winCmd(){ return new WinCmd(); } @Bean @Conditional(LinuxCondition.class) public CmdService linuxCmd(){ return new LinuxCmd(); } }
配置类说明:
如果是windows则实例化WinCmd类。
如果是linux则实例化LinuxCmd类。
4 测试类
public class App { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ShareniuConfig.class); CmdService cmdService = context.getBean(CmdService.class); String showListCmd = cmdService.showListCmd(); System.out.println(showListCmd); } }
输出结果如下:
dir
转载请注明:分享牛 » spring Condition使用