一、Condition
Condition是spring-context提供的基于条件来决定是否执行后续步骤。
二、使用步骤
1.定义服务
1.1定义接口
Service.java
package com.student.condition.service;
/**
* Create by zjg on 2022/6/16
*/
public interface Service {
void execute();
}
1.2定义实现类
LinuxService.java
package com.student.condition.service.impl;
import com.student.condition.service.Service;
/**
* Create by zjg on 2022/6/16
*/
public class LinuxService implements Service {
@Override
public void execute() {
System.out.println("欢迎使用Linux系统");
}
}
WindowsService.java
package com.student.condition.service.impl;
import com.student.condition.service.Service;
/**
* Create by zjg on 2022/6/16
*/
public class WindowsService implements Service {
@Override
public void execute() {
System.out.println("欢迎使用Windows系统");
}
}
2.条件类
判断条件实际中可以使用配置文件中的,更灵活。
LinuxCondition.java
package com.student.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Create by zjg on 2022/6/16
*/
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("os.name").contains("Linux");
}
}
WindowsCondition.java
package com.student.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Create by zjg on 2022/6/16
*/
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("os.name").contains("Windows");
}
}
3.使用条件判断生效的bean对象
SystemConfig.java
package com.student.condition.config;
import com.student.condition.LinuxCondition;
import com.student.condition.WindowsCondition;
import com.student.condition.service.Service;
import com.student.condition.service.impl.LinuxService;
import com.student.condition.service.impl.WindowsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* Create by zjg on 2022/6/16
*/
@Configuration
public class SystemConfig {
private Service service;
@Bean
@Conditional(WindowsCondition.class)
Service getWindowsService(){
service=new WindowsService();
return service;
}
@Bean
@Conditional(LinuxCondition.class)
Service getLinuxService(){
service=new LinuxService();
return service;
}
public Service getService(){
return service;
}
}
三、测试类
package com.student;
import com.student.condition.config.SystemConfig;
import com.student.condition.service.Service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
/**
* Create by zjg on 2022/9/25
*/
@RunWith(SpringRunner.class) //作用:让当前类在容器环境下进行测试
@SpringBootTest(classes = SpringbootStart.class)//作用:声明当前类是springboot的测试类并且获取入口类上的相关信息 SpringBootApplication是入口类类名
public class SpringbootStartTest {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private SystemConfig systemConfig;
@Test
public void test(){
queryBean();
}
public void queryBean(){
Service service = applicationContext.getBean(Service.class);
System.out.println(service);
System.out.println(systemConfig.getService());
}
}
windows环境下测试的,两种方式都可以获取。
总结
Condition需要结合实际中的业务需要去做修改,挺好用的。