我在学习策略模式的时候, 发现当SpringBoot注入一个Map的时候 ,value泛型为T,则注入后Spring会将实例化后的bean放入value ,key则为注入后bean的名字
Springboot如何解析Map中的Value
Spring 通过解析 Map 的泛型信息来确定要注入哪些 Bean。尽管 Java 的泛型在运行时会被擦除,但 Spring 利用 ResolvableType 或其他反射机制来获取泛型参数 T 的具体类型,从而进行类型匹配。
AutowiredAnnotationBeanPostProcessor:这个后置处理器负责处理 @Autowired 注解的逻辑。当它处理 Map 类型的字段时,会根据泛型 T 的类型,从 Spring 容器中查找所有匹配的 Bean,并将它们注入到 Map 中。
AutowiredAnnotationBeanPostProcessor类负责处理@Autowired这类注解的逻辑。
那么你在AutowiredAnnotationBeanPostProcessor类中搜索resolveDependency可以找到
点进去你会发现ResolvableType这个类,而ResolvableType是Spring框架中的一个工具类,用于在运行时解析和处理泛型类型。它在Spring的依赖注入机制中扮演着重要角色,特别是在处理集合类型依赖(如Map、List)时.
那到这里我已经找到了springboot如何解析Map中的value的秘密
那为什么它的key的bean的名字呢?
springboot是如何知道map的key就是bean的名字?
在Spring Boot中,当注入一个泛型为T的Map时,Spring会将所有类型为T的Bean实例放入Map的value中,而key是这些Bean的名字。这种机制是Spring Framework的默认行为,而非Spring Boot特有的功能。
BeanFactoryUtils.getBeansOfType方法:用于获取所有指定类型的Bean,并返回一个Map,键为Bean的名字,值为Bean的实例。
这个方法可以在DefaultListableBeanFactory.getBeansOfType
到这里我们就大概知道为什么springboot中map的key是BeanName了