Spring 條件註解(@Conditional)
阿新 • • 發佈:2019-01-04
通過活動的profile,我們可以獲得不同的Bean。Spring 4提供了一個更通用的基於條件的Bean的建立方式,即使用@Conditional註解。
@Conditional根據滿足某個特定的條件建立一個特定的Bean。比如,當某一個jar包在一個類路徑下時,自動配置一個或者多個Bean。或者只有一個Bean建立時,才會建立另一個Bean。總的來說,就是根據特定條件來控制Bean的建立行為,這樣我們可以利用這個特性進行一些自動配置。
下面的示例將以不同的作業系統作為條件,我們將通過實現Condition介面,並重寫其matches方法來構造判斷條件。如在Windows系統下執行程式輸出dir,Linux下輸出ls。
一、判斷條件定義
1、判定Windows的條件
package com.chenfeng.xiaolyuh.conditional.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Windows"); } }
2、判定Linux的條件
package com.chenfeng.xiaolyuh.conditional.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Linux"); } }
二、不同系統下的Bean
1、介面
package com.chenfeng.xiaolyuh.conditional.service;
public interface ListService {
public String showListCmd();
}
2、Windows下所要建立的Bean
package com.chenfeng.xiaolyuh.conditional.service.impl;
import com.chenfeng.xiaolyuh.conditional.service.ListService;
public class WindowsListService implements ListService {
@Override
public String showListCmd() {
return "dir";
}
}
3、Linux下所要建立的Bean
package com.chenfeng.xiaolyuh.conditional.service.impl;
import com.chenfeng.xiaolyuh.conditional.service.ListService;
public class LinuxListService implements ListService {
@Override
public String showListCmd() {
return "ls";
}
}
三、配置類
package com.chenfeng.xiaolyuh.conditional.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import com.chenfeng.xiaolyuh.conditional.condition.LinuxCondition;
import com.chenfeng.xiaolyuh.conditional.condition.WindowsCondition;
import com.chenfeng.xiaolyuh.conditional.service.ListService;
import com.chenfeng.xiaolyuh.conditional.service.impl.LinuxListService;
import com.chenfeng.xiaolyuh.conditional.service.impl.WindowsListService;
@Configuration
@ComponentScan(basePackages="com.chenfeng.xiaolyuh.conditional")
public class ConditionConfig {
@Bean
@Conditional(LinuxCondition.class)// 使用@Conditional註解,符合Linux條件就例項化LinuxListService
public ListService linuxListService() {
return new LinuxListService();
}
@Bean
@Conditional(WindowsCondition.class)// 使用@Conditional註解,符合Windows條件就例項化WindowsListService
public ListService windowsListService() {
return new WindowsListService();
}
}
四、測試類
package com.chenfeng.xiaolyuh.test;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.chenfeng.xiaolyuh.conditional.config.ConditionConfig;
import com.chenfeng.xiaolyuh.conditional.service.ListService;
public class SpringConditionalTest {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
@Test
public void contextTest() {
ListService listService = context.getBean(ListService.class);
System.out.println(context.getEnvironment().getProperty("os.name")
+ "系統下的列表命令為:"
+ listService.showListCmd());;
}
@After
public void closeContext() {
context.close();
}
}