@Autowired原理(四)
@Autowired注解注入的成员变量还有可能是一种特殊的成员变量。注入的本身是一个容器类型,那么改如何解析呢?
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, IllegalAccessException {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestAutowired2.class);//1.解析数组类型的依赖注入//testArray(factory);//2.解析集合类型的依赖注入//testList(factory);//3.测试注入容器类型testApplicationContext(context.getDefaultListableBeanFactory());}
方法如下:
private static void testApplicationContext(DefaultListableBeanFactory beanFactory) throws NoSuchFieldException, IllegalAccessException {DependencyDescriptor dd3 = new DependencyDescriptor(Target.class.getDeclaredField("applicationContext"),true);Field resolvableDependencies = DefaultListableBeanFactory.class.getDeclaredField("resolvableDependencies");resolvableDependencies.setAccessible(true);Map<Class<?>,Object> dependencies = (Map<Class<?>,Object>) resolvableDependencies.get(beanFactory);for (Map.Entry<Class<?>,Object> entry : dependencies.entrySet()) {//左边类型if (entry.getKey().isAssignableFrom(dd3.getDependencyType())) {System.out.println(entry.getValue());break;}}}
@Componentstatic class Target {@Autowired private Service[] serviceArray;@Autowired private List<Service> serviceList;@Autowired private ConfigurableApplicationContext applicationContext;}
还是一样,首先得使用DependencyDescriptor(Target.class.getDeclaredField("applicationContext"),true)获得注解解析器。
再去上面的类里面找一个属性为resolvableDependencies的值,所有的容器类型的依赖注入值被存进了这个Map集合。然后遍历该集合与我们通过解析器解析的类型进行比较获得。输出结果如下: