一、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的實例。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192131.html