java spring 条件注解,Spring里的条件注解@Conditional

一、简介

平常在开发的时候,我们经常会遇到在满足某些特定条件情况下才去创建某个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值