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

Spring Condition:获取当前创建的Bean相关信息

Spring Condition接口获取当前处理Bean名称的方案

直接通过ConditionContext或AnnotatedTypeMetadata参数无法直接获取当前正在处理的Bean名称,这两个参数默认不暴露该信息,但可以通过元数据间接推断:

  • 当@Conditional标注在@Bean方法上时:
    利用AnnotatedTypeMetadata获取方法元数据来推断Bean名称,代码示例:

    MethodMetadata methodMetadata = (MethodMetadata) metadata;
    // 优先取@Bean注解指定的name/value属性作为Bean名称
    Map<String, Object> beanAttrs = methodMetadata.getAnnotationAttributes(Bean.class.getName());
    String[] beanNames = (String[]) beanAttrs.get("value");
    if (beanNames.length > 0) {
        return beanNames[0];
    }
    // 未指定名称时,默认Bean名称为方法名
    return methodMetadata.getMethodName();
    
  • 当@Conditional标注在类上(如@Component/@Configuration类)时:
    通过AnnotatedTypeMetadata获取类元数据推断Bean名称,代码示例:

    ClassMetadata classMetadata = (ClassMetadata) metadata;
    // 优先取@Component注解指定的value属性作为Bean名称
    Map<String, Object> componentAttrs = metadata.getAnnotationAttributes(Component.class.getName());
    String[] componentNames = (String[]) componentAttrs.get("value");
    if (componentNames.length > 0) {
        return componentNames[0];
    }
    // 未指定名称时,默认Bean名称为类名首字母小写
    String className = classMetadata.getClassName();
    return Character.toLowerCase(className.charAt(0)) + className.substring(1);
    

另外,如果你需要调用该Bean的静态方法,无需依赖Bean名称——直接通过metadata拿到对应的类/方法元数据,反射调用静态方法即可。比如从ClassMetadata获取类全限定名,通过Class.forName()获取类对象后调用静态方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:33:14