You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot中创建可向配置传值的@Enable注解

在Spring Boot 3.2中从@Enable注解传递参数给自动配置类

方法一:让配置类实现ImportAware接口

这种方法适合保留原有@Configuration类结构,借助Spring的ImportAware机制获取导入当前配置类的注解元数据:

  1. 修改CustomAutoConfiguration实现ImportAware接口,提取注解参数:
@Configuration
public class CustomAutoConfiguration implements ImportAware {

    private String someString;

    @Override
    public void setImportMetadata(AnnotationMetadata importMetadata) {
        // 读取@EnableCustomAutoConfiguration注解的属性
        Map<String, Object> annotationAttrs = importMetadata.getAnnotationAttributes(EnableCustomAutoConfiguration.class.getName());
        if (annotationAttrs != null) {
            this.someString = (String) annotationAttrs.get("someString");
        }
    }

    @Bean
    public CustomBean customBean() {
        // 使用参数实例化CustomBean
        return new CustomBean(someString);
    }
}
  1. 启动类中传入注解参数:
@SpringBootApplication
@EnableCustomAutoConfiguration(someString = "your-custom-value")
public class MySpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
  1. 可选:给注解参数设置默认值,避免未传参时空指针:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(CustomAutoConfiguration.class)
public @interface EnableCustomAutoConfiguration {
   String someString() default "default-value";
}

方法二:使用ImportBeanDefinitionRegistrar直接注册Bean

这种方法跳过@Configuration类,直接通过注册器根据注解参数创建并注册Bean,灵活性更高:

  1. 修改@EnableCustomAutoConfiguration注解,导入自定义注册器:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(CustomBeanRegistrar.class)
public @interface EnableCustomAutoConfiguration {
   String someString();
}
  1. 实现ImportBeanDefinitionRegistrar,读取注解参数并注册Bean:
public class CustomBeanRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 提取注解参数值
        Map<String, Object> annotationAttrs = importingClassMetadata.getAnnotationAttributes(EnableCustomAutoConfiguration.class.getName());
        String someString = (String) annotationAttrs.get("someString");

        // 构建CustomBean的Bean定义并传入参数
        BeanDefinitionBuilder beanBuilder = BeanDefinitionBuilder.genericBeanDefinition(CustomBean.class);
        beanBuilder.addConstructorArgValue(someString);

        // 将Bean注册到Spring容器
        registry.registerBeanDefinition("customBean", beanBuilder.getBeanDefinition());
    }
}
  1. 启动类的使用方式和方法一一致,传入someString参数即可。

注意事项

  • 确保@EnableCustomAutoConfiguration的RetentionPolicy为RUNTIME,否则Spring无法在运行时读取注解属性。
  • 若需处理多个参数,只需在getAnnotationAttributes中提取对应key即可。

内容的提问来源于stack exchange,提问作者Johan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:05:26