Skip to content

一、为什么要使用 @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 对象已装配完毕...