一、getbeannamesfortype概述
/** * Return the names of all beans of the specified type or subtypes, for the given bean factory. * @param beanFactory the bean factory to find bean names in * @param type the type that beans must match (as a {@code Class}) * @return the names of all beans of the specified type or subtypes (if any), * or an empty array if none * @since 3.0 */ public static String[] getBeanNamesForType(ListableBeanFactory beanFactory, Class type) { return BeanFactoryUtils.beanNamesForTypeIncludingAncestors(beanFactory, type); }
getbeannamesfortype是Spring Framework提供的一个方法,用于获取指定类及其子类在IOC容器中的所有bean的名称。该方法的基础调用方法是beanNamesForTypeIncludingAncestors(beanFactory, type)。
二、getbeannamesfortype with
1、通过beanFactory获取
ListableBeanFactory beanFactory = // 获取beanFactory实例 String[] beanNames = getBeanNamesForType(beanFactory, TestBean.class);
需要理解的是getBeanNamesForType方法需要的参数是ListableBeanFactory和Class类型的type。不过要获得ListableBeanFactory对象,可以通过多种方式。
比如通过FileSystemXmlApplicationContext、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext来获取beanFactory实例。
2、使用继承关系
String[] beanNames = getBeanNamesForType(beanFactory, ParentTestBean.class);
getBeanNamesForType方法同时支持查询某个类的所有子类的bean名称。这是基于某个bean定义按继承关系组织在IOC中的情况。这种情况下,查询ParentTestBean的子类TestBean的bean名称时会返回相应的结果。
3、使用泛型类型
String[] beanNames = getBeanNamesForType(beanFactory, new ParameterizedTypeReference<Map<String, List<String>>>() {});
getBeanNamesForType方法同时支持查询复杂泛型类型的bean。可以通过new ParameterizedTypeReference来获取泛型类,如上述代码中的Map<String, List<String>>。
三、getbeannamesfortype的返回值
1、返回值为所有bean名称数组
String[] beanNames = getBeanNamesForType(beanFactory, TestBean.class);
当IOC中有多个符合类型的bean时,getBeanNamesForType方法返回所有bean名称的数组。
2、返回值为空数组
String[] beanNames = getBeanNamesForType(beanFactory, NonExistType.class);
当IOC中不存在某类型的bean时,getBeanNamesForType方法返回一个空数组。
3、返回值为根据父子继承关系组织的bean名称数组
@Test public void testGetBeanNamesForTypeWithHierarchy() { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions("com/example/demo/spring.xml"); String[] beanNames = getBeanNamesForType(beanFactory, Animal.class); assertEquals(2, beanNames.length); assertEquals("dog", beanNames[0]); assertEquals("cat", beanNames[1]); }
当IOC容器中使用父子继承关系组织bean定义时,getBeanNamesForType方法返回的bean名称数组按照继承关系从上到下进行排序。
四、总结
getbeannamesfortype是Spring Framework中的一个常用工具方法,用于查询IOC容器中符合条件的bean的名称,并且支持查询类型及其子类型、泛型类型相关的bean名称。同时,该方法返回的bean名称数组可以用于进一步操作,比如通过beanFactory获取到bean的实例。