@Conditional
根據滿足某一個特定條件創建一個特定的 Bean。就是根據特定條件來控制 Bean 的創建行為,這樣我們可以利用這個特性進行一些自動的配置- Springboot 中大量用到了條件注解
- 示例,以不同的操作系統作為條件,我們將通過實現
Condition
接口,並重寫其matches()
方法來構造判斷條件。若在 Windows 系統下運行程序,則輸出列表命令為 dir ,若在 Linux 系統下運行程序,則輸出列表命令為 ls-
判斷 Window 條件
public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Windows"); } }
-
判斷 Linux 條件
public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Linux "); } }
-
不同系統下的 Bean 類
-
接口
public interface ListService { String showListCmd(); }
-
Window 下所要創建的 Bean 類
public class WindowsListService implements ListService{ @Override public String showListCmd() { return "dir"; } }
-
Linux 下所要創建的 Bean 類
public class LinuxListService implements ListService { @Override public String showListCmd() { return "ls"; } }
-
-
配置類
@Configuration public class ConditionConfig { @Bean @Conditional(WindowsCondition.class) public ListService windowsListService(){ return new WindowsListService(); } @Bean @Conditional(LinuxCondition.class) public ListService linuxListService(){ return new LinuxListService(); } }
-
測試類
@RunWith(SpringRunner.class) @SpringBootTest(classes = Ch522Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class TaskTest { @Autowired private ListService listService; @Test public void conditionalTest() { System.out.println(listService.showListCmd()); } }
-
測試結果
dir
-