功能特性
@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中。