@Conditional注解

在Spring框架中,@Conditional注解用于基于特定条件有选择地注册bean。通过@Conditional注解,可以在应用程序上下文中有条件地注册bean,而不是在所有情况下都注册它们。这对于创建灵活和可配置的Spring应用程序非常有用。

@Conditional的基本用法

@Conditional注解本身没有任何条件逻辑。它依赖于一个或多个实现了Condition接口的类来定义条件逻辑。以下是@Conditional的使用步骤:

  1. 创建一个实现了Condition接口的类

    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    public class MyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            // 条件逻辑,例如检查某个系统属性
            return "true".equals(System.getProperty("my.condition.property"));
        }
    }
    
  2. 使用@Conditional注解条件性地注册bean

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Conditional;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        @Conditional(MyCondition.class)
        public MyService myService() {
            return new MyService();
        }
    }
    

在这个示例中,如果系统属性my.condition.property设置为truemyService bean将会被注册。

@Conditional的常见实现

Spring框架提供了一些现成的条件类,您可以直接使用这些类来实现常见的条件需求:

  1. @ConditionalOnProperty:

    • 根据配置属性的值来注册bean。
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        @ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
        public MyService myService() {
            return new MyService();
        }
    }
    
  2. @ConditionalOnClass:

    • 当类路径下存在特定类时注册bean。
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        @ConditionalOnClass(name = "com.example.SomeClass")
        public MyService myService() {
            return new MyService();
        }
    }
    
  3. @ConditionalOnMissingBean:

    • 当上下文中缺少特定bean时注册bean。
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        @ConditionalOnMissingBean(MyService.class)
        public MyService myService() {
            return new MyService();
        }
    }
    

示例项目结构

一个使用@Conditional的简单Spring Boot项目结构可能如下:

src
└── main
    ├── java
    │   └── com
    │       └── example
    │           ├── ConditionalDemoApplication.java
    │           ├── MyCondition.java
    │           ├── MyConfiguration.java
    │           └── MyService.java
    └── resources
        └── application.properties

完整示例代码

ConditionalDemoApplication.java:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConditionalDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConditionalDemoApplication.class, args);
    }
}

MyCondition.java:

package com.example;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "true".equals(System.getProperty("my.condition.property"));
    }
}

MyConfiguration.java:

package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Conditional;

@Configuration
public class MyConfiguration {

    @Bean
    @Conditional(MyCondition.class)
    public MyService myService() {
        return new MyService();
    }
}

MyService.java:

package com.example;

public class MyService {
    public MyService() {
        System.out.println("MyService bean created!");
    }
}

application.properties:

# my.condition.property=true

运行项目

  1. 设置系统属性:

    java -Dmy.condition.property=true -jar target/conditional-demo-0.0.1-SNAPSHOT.jar
    
  2. 检查输出:
    如果条件满足(my.condition.property设置为true),控制台将输出"MyService bean created!"。否则,不会创建MyService bean。

通过这些步骤,您可以在Spring应用程序中使用@Conditional注解根据特定条件有选择地注册bean。

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值