2017-08-10 85 views
0
class ProfileCondition implements Condition { 
    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
    MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName()); 
    if (attrs != null) { 
     for (Object value : attrs.get("value")) { 
      if (context.getEnvironment().acceptsProfiles((String[]) value)){ 
       return true; 
      } 
     } 
     return false; 
    } 
    return true; 
} 

正如你所看到的,ProfileCondition获取从AnnotationTypeMetadata @profile注解注释的所有属性。在配置文件类中,值定义为String[] value();因此,for (Object value : attrs.get("value")意思是value是一个String参数,但它为什么转换为String []类型?为什么Spring的ProfileCondition.matches方法将值(Object)转换为String []类型?

+0

'value' *必须*为'String []',否则会抛出'ClassCastException'。 –

回答

0

这里的关键是查看你正在查询的数据结构。 attrsMultiValueMap,或者是将密钥(在这种情况下为String)映射到某些数值(在这种情况下,每种类型为Object)的数据结构。 attrs.get返回特定键映射到的一组值。因此,attrs.get返回对象列表,List<Object>。由于我们查询的是"values",所以返回的列表由单个Object组成,其实际上是String[]。但是,由于MultiValueMap存储了几种不同类型的值,因此地图的值类型必须是共同的祖先类:Object

总而言之,attrs.get可以有效地返回多个结果,因此返回一个可迭代的结果。对于密钥"values",返回类型是(有效)List<String[]>。我们遍历迭代器,并且在for循环的每次迭代中,value的类型为String[],并且因此被降级。

+0

谢谢,我首先混淆了'MultiValueMap '''Object'。现在,我意识到'Object'是“多图值”而不是'String []'。但我仍然困惑为什么'getAllAnnotationAttributes'方法返回一个映射,其中一些键映射多个值。当然,这并不意味着'Profile'注解类中有多个名为“value”的字段? – cassia

+0

从文档:“请注意,此变体不考虑属性覆盖。”因此它返回属性的所有定义,而不考虑覆盖返回单个属性。 – colavitam

相关问题