一、简介
平常在开发的时候,我们经常会遇到在满足某些特定条件情况下才去创建某个bean。这个特定条件,可以是某项配置是否配置,某个bean是否存在,某个jar包是否在特定的路径下等等。总之所有这些需要用到条件判断的场景我们都可以使用@Conditional注解来达到自动配置的效果。
如果您阅读过springboot的源码,就会发现springboot里大量使用了这一特性。
下面就以一个示例进行实战,假设我现在需要获取当前系统环境的cpu、内存、磁盘等实时信息,那windows和linux的代码实现是不一样的。
二、代码示例
2.1 先准备一个bean来盛放监控信息
import lombok.Builder;
import lombok.Data;
/**
* 监控信息类
*/
@Data
@Builder
public class MonitorInfo {
private String system;
private String cpu;
private String memory;
private String disk;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
importlombok.Builder;
importlombok.Data;
/**
* 监控信息类
*/
@Data
@Builder
publicclassMonitorInfo{
privateStringsystem;
privateStringcpu;
privateStringmemory;
privateStringdisk;
}
2.2 定义监控信息展示服务类
/**
* 监控服务接口
*/
@Service
public interface MonitorService {
MonitorInfo showInfo();
}
1
2
3
4
5
6
7
/**
* 监控服务接口
*/
@Service
publicinterfaceMonitorService{
MonitorInfoshowInfo();
}
/**
* Linux获取监控信息
*/
public class LinuxMonitorService implements MonitorService {
@Override
public MonitorInfo showInfo() {
// 模拟Linux环境下获取监控信息
return MonitorInfo.builder().system("linux").cpu("10%").memory("20%").disk("11G").build();
}
}
1
2
3
4
5
6
7
8
9
10
/**
* Linux获取监控信息
*/
publicclassLinuxMonitorServiceimplementsMonitorService{
@Override
publicMonitorInfoshowInfo(){
// 模拟Linux环境下获取监控信息
returnMonitorInfo.builder().system("linux").cpu("10%").memory("20%").disk("11G").build();
}
}
/**
* windows获取监控信息
*/
public class WindowsMonitorService implements MonitorService {
@Override
public MonitorInfo showInfo() {
// 模拟windows环境下获取监控信息
return MonitorInfo.builder().system("windows").cpu("12%").memory("22%").disk("10G").build();
}
}
1
2
3
4
5
6
7
8
9
10
/**
* windows获取监控信息
*/
publicclassWindowsMonitorServiceimplementsMonitorService{
@Override
publicMonitorInfoshowInfo(){
// 模拟windows环境下获取监控信息
returnMonitorInfo.builder().system("windows").cpu("12%").memory("22%").disk("10G").build();
}
}
2.3 系统判断类,重要的是要实现Condition类重写matches方法
/**
* linux 判断条件
*/
public class LinuxCondition implements Condition {
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux");
}
}
1
2
3
4
5
6
7
8
9
/**
* linux 判断条件
*/
publicclassLinuxConditionimplementsCondition{
publicbooleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata){
returncontext.getEnvironment().getProperty("os.name").contains("Linux");
}
}
/**
* windows 判断条件
*/
public class WindowsCondition implements Condition {
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
1
2
3
4
5
6
7
8
9
/**
* windows 判断条件
*/
publicclassWindowsConditionimplementsCondition{
publicbooleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata){
returncontext.getEnvironment().getProperty("os.name").contains("Windows");
}
}
2.4 配置不同系统对应的service
/**
* 监控配置类
*/
@Configuration
public class MonitorConfig {
@Bean
@Conditional(WindowsCondition.class)
public MonitorService windowsMonitorConfig(){
return new WindowsMonitorService();
}
@Bean
@Conditional(LinuxCondition.class)
public MonitorService linuxMonitorConfig(){
return new LinuxMonitorService();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 监控配置类
*/
@Configuration
publicclassMonitorConfig{
@Bean
@Conditional(WindowsCondition.class)
publicMonitorServicewindowsMonitorConfig(){
returnnewWindowsMonitorService();
}
@Bean
@Conditional(LinuxCondition.class)
publicMonitorServicelinuxMonitorConfig(){
returnnewLinuxMonitorService();
}
}
2.5 测试类
/**
* 测试类
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MonitorTest {
@Autowired
private MonitorService monitorService;
@Test
public void infoTest(){
System.out.println(monitorService.showInfo().toString());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 测试类
*/
@RunWith(SpringRunner.class)
@SpringBootTest
publicclassMonitorTest{
@Autowired
privateMonitorServicemonitorService;
@Test
publicvoidinfoTest(){
System.out.println(monitorService.showInfo().toString());
}
}
2.6 运行结果,这个结果是在本机windows系统运行的
MonitorInfo(system=windows, cpu=12%, memory=22%, disk=10G)
2.7 示例代码下载
浏览量:
443
0