GenericApplicationContext支持泛型类型安全的Bean查找,需注册时保留泛型信息并使用带泛型参数的getBean()方法;实际“感知”依赖开发人员提供类型线索,容器据此匹配校验。
GenericApplicationContext 本身不直接“感知”泛型 Bean,它作为 ApplicationContext 的一个通用实现,**支持泛型类型安全的 Bean 查找**,但前提是 Bean 在注册时已携带类型信息(如通过 GenericBeanDefinition 或 @Bean 方法的返回泛型),且查找时使用带泛型参数的 getBean() 方法。
Spring 容器要支持泛型感知,关键在于 Bean 定义阶段是否保留了泛型元数据:
setBeanClass() 和 setConstructorArgumentValues(),但泛型擦除限制下,容器无法还原运行时泛型——真正起作用的是 getBean(Class<T> requiredType) 中传入的具体类型参数GenericApplicationContext 继承自 AbstractApplicationContext,天然支持泛型参数的 getBean 调用。这是最常用、最可靠的“泛型感知”方式:
service = context.getBean("myService", ServiceImpl.class) —— 明确指定具体类型,避免强转map = context.getBeansOfType(Map.class) —— 按原始类型匹配,忽略泛型参数(如 Map<String, User> 和 Map<Integer, Order> 都会被匹配)Map<String, User>),需配合 ResolvableType:该工具类是对 BeanFactory 的泛型封装,适用于 ListableBeanFactory(包括 GenericApplicationContext):
立即学习“Java免费学习笔记(深入)”;
getBean("id", Service.class) 或 getBeansOfType(Service.class),内部自动处理类型检查,省去显式造型Java 泛型擦除决定了 Spring 无法在运行时“反射出”某个 Bean 的完整泛型类型。所谓“感知”,本质是开发人员主动提供类型线索,容器据此做匹配和校验:
Repository<User> 和 Repository<Order>)若注册为不同 beanName,可通过 name + type 组合精准获取@Autowired private Repository<User> userRepo;)在 Spring 4.0+ 可被正确解析