为什么Spring的ProfileCondition.matches方法将值(Object)转换为String []类型?

时间:2017-08-10 06:25:59

标签: java spring

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注释的所有注释属性。在Profile类中,值定义为String[] value();因此,for (Object value : attrs.get("value")表示value是一个String参数,但为什么它被转换为String []类型?

1 个答案:

答案 0 :(得分:0)

这里的关键是查看您要查询的数据结构。 attrs是一个MultiValueMap或一个数据结构,它将一个键(在本例中为String)映射到一定数量的值(在本例中为每个类型Object) 。 attrs.get返回特定键映射到的值集。因此,attrs.get会返回对象列表List<Object>。由于我们要查询"values",因此返回的列表包含一个Object,实际上是String[]类型。但是,由于MultiValueMap存储了几种不同类型的值,因此映射的值类型必须是共同的祖先类:Object

总而言之,attrs.get可以返回多个结果,因此返回一个可迭代的结果。对于密钥"values",它的返回类型是(有效)List<String[]>。我们迭代迭代,并且在for循环的每次迭代中,value都是String[]类型并且是向下转换的。