一. 点睛
在Spring4.x常用配置(四):Spring Profile中知道,通过活动的profile
可以获得不同的Bean
。Spring4
提供了一个更加通用的基于条件的Bean
的创建,即使用@Conditional
注解。
@Conditional
根据满足某一个特定条件创建一个特定的Bean
。比如说,当某一个jar
包在某一个类路径下的时候,自动配置一个或者多个Bean
;或者只有某个Bean
被创建才会创建另外一个Bean
。总的来说,就是根据特定条件来控制Bean
的创建行为,这样我们可以利用这个特性进行一些自动的配置。
在Spring Boot
中大量的应用到条件注解,后面有机会我们会说到。
下面的示例将以不同的操作系统为条件,将通过实现Condition
接口,并重写其matches
方法来构造判断条件。若在Windows
系统下运行程序,则输出列表命令 为dir
;若在Linux
操作系统下运行程序,则输出列表命令为ls
。
二. 示例
1. 判断条件定义
1.1 判定Windows的条件
package org.light4j.sping4.senior.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsCondition implements Condition {
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
1.2 判定Linux的条件
package org.light4j.sping4.senior.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxCondition implements Condition {
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux");
}
}
2. 不同系统下的Bean类
2.1 接口
package org.light4j.sping4.senior.conditional;
public interface ListService {
public String showListCmd();
}
2.2 Windows下所要创建的Bean类
package org.light4j.sping4.senior.conditional;
public class WindowsListService implements ListService {
@Override
public String showListCmd() {
return "dir";
}
}
2.3 Linux下所要创建的Bean类
package org.light4j.sping4.senior.conditional;
public class LinuxListService implements ListService{
@Override
public String showListCmd() {
return "ls";
}
}
3. 配置类
package org.light4j.sping4.senior.conditional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionConifg {
@Bean
@Conditional(WindowsCondition.class) //①
public ListService windowsListService() {
return new WindowsListService();
}
@Bean
@Conditional(LinuxCondition.class) //②
public ListService linuxListService() {
return new LinuxListService();
}
}
代码解释:
① 通过
@Conditional
注解,符合Windows
条件则实例化windowsListService
。
② 通过@Conditional
注解,符合Linux
条件则实例化linuxListService
。
4. 运行
package org.light4j.sping4.senior.conditional;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConifg.class);
ListService listService = context.getBean(ListService.class);
System.out.println(context.getEnvironment().getProperty("os.name") + "系统下的列表命令为: " + listService.showListCmd());
context.close();
}
}
我的系统是windows,运行结果如下图所示:
5. 源代码示例:
打赏 欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA