@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