一、为什么要使用 @Condition ?
- 作用:通过条件判断注入Bean 对象,因为这样可以减少资源的浪费,再条件判断成功后,才会注入对象。
二、@Condition 使用
1. 创建一个 Win10.java 类
java
package org.example.spring5.domain;
import lombok.Data;
/**
* @author: Calvin <br>
* @date: 2020/11/25 17:26 <br>
* @since: 1.0 <br>
* @description: Win10 <br>
*/
@Data
public class Win10 {
public Win10() {
System.out.println("2. Win10 对象将被注入到容器中...");
}
}
2. 创建一个 OsCondition.java 类。
- 作用:用于判断当前操作系统是否注入该 Win10 对象到 Spring 容器中。
java
package org.example.spring5.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;
/**
* @author: Calvin <br>
* @date: 2020/11/25 17:21 <br>
* @since: 1.0 <br>
* @description: OsCondition <br>
*/
public class OsCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
// 1.获取当前程序的运行环境
Environment environment = conditionContext.getEnvironment();
// 2. 获取操作系统名称
String osName = environment.getProperty("os.name");
// 判断是否什么操作系统,返回可以注册该对象,否则不能注册该对象
if (osName.equals("Windows 10")) {
System.out.println("1. 当前系统为: Windows 10操作系统");
return true;
}
return false;
}
}
3. 在 SpringConfiguration 类, 添加@Condition
java
package org.example.spring5.config;
import org.example.spring5.condition.OsCondition;
import org.example.spring5.domain.User;
import org.example.spring5.domain.Win10;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* @author: Calvin <br>
* @date: 2020/11/25 14:18 <br>
* @since: 1.0 <br>
* @description: SpringConfig <br>
*/
@Configuration // @Configuration 相当于 application-context.xml
@ComponentScan(value = "org.example.spring5") // 通过扫包 org.example.spring5, 将标记有 @Service @Repository @Controller @Component 放入到该配置文件中。
public class SpringConfiguration {
/**
* 注解Bean 相当于 <bean></bean>标签
* @return User
*/
@Bean
public User user(){
return new User(1L, "Calvin", 26);
}
@Bean
@Conditional(value = OsCondition.class)
public Win10 win10(){
return new Win10();
}
}
4. 启动程序
java
package org.example.spring5;
import org.example.spring5.config.SpringConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author: Calvin <br>
* @date: 2020/11/25 14:27 <br>
* @since: 1.0 <br>
* @description: SpringApplication <br>
*/
public class SpringApplication {
private static AnnotationConfigApplicationContext annotationConfigApplicationContext;
public static void main(String[] args) {
annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
System.out.println("3. Bean 对象已装配完毕...");
}
}
5. 测试结果
log
1. 当前系统为: Windows 10操作系统
2. Win10 对象将被注入到容器中...
3. Bean 对象已装配完毕...