Spring:@Autowired注入Map或List集合

1,756 阅读1分钟

功能特性

@Service
public class EvaluationFactory {
    private final Map<String, EvaluationService> evaluationServiceMap;

    @Autowired
    public EvaluationFactory(Map<String, EvaluationService> evaluationServiceMap) {
        this.evaluationServiceMap = evaluationServiceMap;
    }

    /**
     * 按前缀+评估项Item获取对应评估服务服务bean
     */
    public EvaluationService getBean(String evaluationItem) {
        return evaluationServiceMap.get(CommonConst.BeanFactoryPrefix.EVALUATION_ITEM + evaluationItem);
    }
}

在这段代码中(有多个实现类实现 EvaluationService 接口),注入evaluationServiceMap,spring会自动将名称和对应的接口实现类放入map中,不需要我们手动put。这是Spring的一个特殊的注入功能。

 @Autowired
 private Map<Integer, UserService> userServiceMap
 
 @Autowired
 private List<UserService> userServiceList
  • 当注入一个Map的时候 ,value的泛型为UserService,则注入后Spring会将实例化后的bean放入value ,key则为注入后bean的名字
  • 当注入一个List的时候,List的泛型为UserService,则注入后Spring会将实例化的bean放入List中

底层原理

bean包spring-beans源码,类doResolveDependency ,对于@Autowired声明的数组、集合类型,spring并不是根据beanName去找容器中对应的bean,而是把容器中所有类型与集合(数组)中元素类型相同的bean构造出一个对应集合,注入到目标bean中。