当前位置:网络安全 > SpringBoot如何定制自己的条件注解和自动配置?

SpringBoot如何定制自己的条件注解和自动配置?

  • 发布:2023-09-29 21:51

springBoot的核心功能是为集成第三方框架提供自动配置,本文带你实现自己的自动配置和Starter。一旦你真正掌握了本文的内容,你就会明白SpringBoot营造出的“一览众山小”的感觉。

自定义条件注释​​

springboot中,所有自定义条件注解实际上都是基于@Conditional,使用@Conditiona l定义新的条件注释键 必须有Condition实现类,负责条件注解的处理逻辑。该实现类实现的matches()方法判断是否满足条件注释的要求。

以下是自定义条件注解的Condition实现类的代码。

src/main/java/com/example/_003configtest/condition/www.sychzs.cn

package com.example._003configtest.condition;

import com.example._003configtest.annotation.ConditionalCustom;
importorg.spring框架.上下文.注释.条件;
导入 org.springframework.context.annotation.ConditionContext;
导入 org.springframework.core.env.Environment;
导入 org.springframe work.core.type.AnnotatedTypeMetadata;

导入 www.sychzs.cn;


公共  MyCondition  实现 条件 {

    @Override
    公共 布尔值 匹配(ConditionContext上下文,AnnotatedTypeMetadata元数据) {
        //获取骚自定义注解的全部属性,其中ConditionalCustom是自定义的注解
        MapannotationAttributes = metadata.getAnnotationAttributes(ConditionalCustom.班级. getName());
        //获取注解的值属性值
        String[] vals = (String[]) annotationAt三butes.get("value");
//env是application.properties或application.yml中配置的属性
Environ ment env = context.getEnvironment();
                // 遍历每个值的各个属性值

                                                                                                             //如果某个属性值对应的配置属性不存在则返回 false
if(env .getProperty(val.toString())== null){ return false ; true;
}
}

从上面的逻辑可以看到,自定义条件注释的处理逻辑比较简单:它要求所有value 属性指定的配置属性必须存在。这些配置属性的值是什么并不重要,这些配置属性是否有值也不重要。

有了上面的Condition实现类,接下来就可以基于@Conditional定义自定义条件注解。下面是自定义条件注释的代码。

src/main/java/com/example/_003configtest/annotation/www.sychzs.cn

package com.example._003configtest.annotation;
导入 com.example._003configtest.condition.MyCondition;
导入 org.spring框架.上下文.注释.条件;

导入 java.lang.annotation.*;

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolic y.RUNTIME) )
@Documented
//只要通过@Conditional指定Condition实现类,Condition实现类就会负责条件注解的判断逻辑
@Conditional(MyCondition.)
公共 @接口 条件自定义 {

String[] value() default {};

}

以下配置类演示了如何使用此自定义条件注释:

src/main/java/com/example/_003configtest/config/www.sychzs.cn

// proxyBeanMethods = true : 单例模式,保证每个@Bean方法被调用多少次返回的组件是相同的 
// proxyBeanMethods = false : 原型模式,每个@Bean方法被调用多少次这次返回的组件都是新创建的
@Configuration(proxyBeanMethods = true)
public MyConfigTest{
@Bean
//只有当application.properties或application.yml中都存在配置属性org.test1和org.test2时才生效
@Conditional自定义({"org.test1","org.test2"})
公共 MyBean myBean( ){
         返回  MyBean(); }
}

application.properties文件中添加以下配置:

org.test1 = 1
org.test2 = 2

运行测试发现容器中对应的类成功获取:

相关文章

最新资讯

热门推荐