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
相关产品推荐
相关产品推荐

