@Conditional根据满足某一个特定的条件创建一个特定的Bean(基于条件的Bean的创建,即使用@Conditional注解)。
比方说,当一个jar包在一个类的路径下的时候,自动配置一个或多个Bean,或者只有某个Bean被创建才会去创建另外一个Bean。
通过实现Condition接口,并重写期matches方法来构造判断条件。若在windows系统洗运行程序,则输出列表命令dir,若在linux操作系统下运行程序,则输出命令为:ls.
1.判断条件定义
判断windows的条件
1 package ch2.conditional2; 2 3 //条件注解,并复写此类 4 import org.springframework.context.annotation.Condition; 5 //条件注解容器 6 import org.springframework.context.annotation.ConditionContext; 7 import org.springframework.core.type.AnnotatedTypeMetadata; 8 9 public class LinuxCondition implements Condition { 10 11 @Override 12 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 13 // TODO Auto-generated method stub 14 return context.getEnvironment().getProperty("os.name").contains("Linux"); 15 } 16 17 }
判定linux的条件
1 package ch2.conditional2; 2 3 //条件注解接口类,复写metches 4 import org.springframework.context.annotation.Condition; 5 import org.springframework.context.annotation.ConditionContext; 6 import org.springframework.core.type.AnnotatedTypeMetadata; 7 8 public class WindowsCondition implements Condition { 9 10 @Override 11 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 12 // TODO Auto-generated method stub 13 return context.getEnvironment().getProperty("os.name").contains("Windows"); 14 } 15 16 }
2不同系统下的Bean类
1接口
1 package ch2.conditional2; 2 3 public interface ListService { 4 5 public String showListCmd(); 6 }
2windows下要创建的Bean类
1 package ch2.conditional2; 2 3 import ch2.conditional2.ListService; 4 5 public class WindowsListService implements ListService { 6 7 @Override 8 public String showListCmd() { 9 // TODO Auto-generated method stub 10 return "dir"; 11 } 12 13 }
3linux下要创建的Bean类
1 package ch2.conditional2; 2 3 import ch2.conditional2.ListService; 4 5 public class LinuxListService implements ListService { 6 7 @Override 8 public String showListCmd() { 9 // TODO Auto-generated method stub 10 return "ls"; 11 } 12 13 }
3配置类
package ch2.conditional2; //配置类声明 import org.springframework.context.annotation.Configuration; //bean声明 import org.springframework.context.annotation.Bean; //条件限制 import org.springframework.context.annotation.Conditional; //声明为配置类 @Configuration public class ConditionConfig { //注解为Bean @Bean //注解条件判断 @Conditional(WindowsCondition.class) public ListService windowsListService() { return new WindowsListService(); } //注解为Bean @Bean //注解条件判断 @Conditional(LinuxCondition.class) public ListService linuxListService() { return new LinuxListService(); } }
4运行
package ch2.conditional2; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class); ListService listService = context.getBean(ListService.class); System.out.println( context.getEnvironment().getProperty("os.name") + "系统的查看目录的命令是: " + listService.showListCmd() ); context.close(); } }
运行结果:Windows 10系统的查看目录的命令是: dir