SpringBoot自定义条件注解

SpringBoot 条件注解

本文分析基于SpringBoot2.5.7版本进行分析,SpringBoot 条件注解基于SpringFramework4.0注解Conditional、Condition来实现。

SpringBoot 常用条件注解

注解条件判断类备注
@ConditionalOnClassOnClassCondition如果Classpath 存在匹配到class,就创建
@ConditionalOnMissingClassOnClassCondition如果Classpath 不存在匹配到class,就创建
@ConditionalOnBeanOnBeanCondition如果Spring容器中 存在匹配到Bean,就创建
@ConditionalOnMissingBeanOnBeanCondition如果Spring容器 存在匹配到Bean,就创建
@ConditionalOnPropertyOnPropertyCondition如果Spring容器 存在匹配到属性,就创建
@ConditionalOnResourceOnResourceCondition如果ClassPath下存在匹配到resource,就创建
@ConditionalOnWebApplicationOnWebApplicationCondition如果应用类型不满足type(ANY、SERVLET、REACTIVE),就创建
@ConditionalOnNotWebApplicationOnWebApplicationCondition如果应用类型不满足type(ANY、SERVLET、REACTIVE),就创建
@ConditionalOnExpressionOnExpressionCondition基于SpringEL表达式进行判断,如果true就创建

自定义条件注解

  1. 编写条件Class继承Condition或者Condition子类SpringBootCondition
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Map;

public class MyOnCondition extends SpringBootCondition {
    private String defaultValue = "myCondition";

    @Override
    //关键点:实现业务逻辑判断
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> map = metadata.getAnnotationAttributes(MyConditional.class.getName());
        String value = String.valueOf(map.get("value"));
        if (defaultValue.equals(value)) {
            return ConditionOutcome.match(ConditionMessage.forCondition(MyConditional.class)
                    .because("match"));
        } else {
            return ConditionOutcome.noMatch(ConditionMessage.forCondition(MyConditional.class)
                    .because("not match"));
        }
    }
}

  1. 编写自定义注解
import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyOnCondition.class)
public @interface MyConditional {
    String value() default "";
}

  1. 应用注解到@Configuration 类或者@Bean 方法上
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.context.annotation.Configuration;

@MyConditional(value = "myCondition1")
@Configuration(proxyBeanMethods = false)
public class MyTomcatConnector implements TomcatConnectorCustomizer {
    @Override
    public void customize(Connector connector) {
        connector.setPort(9091);
        System.out.println("connector设置为9091");
    }
}

总结

基于SpringBoot 实现自定义注解很方便,我们可以针对公司业务定制自己的条件注解,从实现外部化配置调整应用行为。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值