1.有時(shí)候需要根據(jù)不同條件生成不同的 bean侥涵,這時(shí)候就需要用到 @Conditional 注解。常見(jiàn)的一種用法,就是根據(jù)操作系統(tǒng)類(lèi)型暖途,注冊(cè)不同的 bean卑惜。在 BeanConfig 配置類(lèi)中增加三個(gè) bean。
package io.mieux.config;
import io.mieux.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Bean(value = "zhangsan")
public Person getPerson() {
return new Person("zhangsan", 28);
}
@Bean(value = "linux")
public Person getLinux() {
return new Person("linux", 50);
}
@Bean(value = "windows")
public Person getWindows() {
return new Person("windows", 30);
}
@Bean(value = "mac")
public Person getMac() {
return new Person("mac", 24);
}
}
查看當(dāng)前容器中 Person 類(lèi)的實(shí)例有哪些:
package io.mieux;
import io.mieux.bean.Person;
import io.mieux.config.BeanConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App04 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
String[] beanNames = annotationConfigApplicationContext.getBeanNamesForType(Person.class);
for (String beanName : beanNames) {
System.out.println("beanName: " + beanName);
}
}
}
運(yùn)行效果:
beanName: zhangsan
beanName: linux
beanName: windows
beanName: mac
2.使用 @Conditional 注解來(lái)根據(jù)操作系統(tǒng)的不同注冊(cè)不同的 bean丧肴。首先需要實(shí)現(xiàn) Condition 接口残揉,創(chuàng)建三個(gè) Condition 接口的實(shí)現(xiàn)類(lèi) LinuxConditon、MacConditon 和 WindowsConditon芋浮,獲取運(yùn)行環(huán)境的操作系統(tǒng)類(lèi)型進(jìn)行判斷抱环。
LinuxConditon:
package io.mieux.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
// 判斷是否是 linux 系統(tǒng)
public class LinuxConditon implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String operatingSystem = environment.getProperty("os.name");
if ("linux".equals(operatingSystem)) {
System.out.println("Operating System: " + environment.getProperty("os.name"));
return true;
}
return false;
}
}
WindowsConditon:
package io.mieux.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
// 判斷是否是 windows 系統(tǒng)
public class WindowsConditon implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String operatingSystem = environment.getProperty("os.name");
if (operatingSystem.contains("Windows")) {
System.out.println("Operating System: " + environment.getProperty("os.name"));
return true;
}
return false;
}
}
MacConditon:
package io.mieux.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
// 判斷是否是 mac os 系統(tǒng)
public class MacConditon implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String operatingSystem = environment.getProperty("os.name");
if ("Mac OS X".equals(operatingSystem)) {
System.out.println("Operating System: " + environment.getProperty("os.name"));
return true;
}
return false;
}
}
在 BeanConfig 配置類(lèi)中加上 @Conditional 注解。
package io.mieux.config;
import io.mieux.bean.Person;
import io.mieux.condition.LinuxConditon;
import io.mieux.condition.MacConditon;
import io.mieux.condition.WindowsConditon;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Bean(value = "zhangsan")
public Person getPerson() {
return new Person("zhangsan", 28);
}
@Bean(value = "linux")
@Conditional(value = {LinuxConditon.class})
public Person getLinux() {
return new Person("linux", 50);
}
@Bean(value = "windows")
@Conditional(value = {WindowsConditon.class})
public Person getWindows() {
return new Person("windows", 30);
}
@Bean(value = "mac")
@Conditional(value = {MacConditon.class})
public Person getMac() {
return new Person("mac", 24);
}
}
運(yùn)行效果:
Operating System: Mac OS X
beanName: zhangsan
beanName: mac