1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| public class DigInAutowired { public static void main(String[] args) throws Throwable { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("bean2", new Bean2()); beanFactory.registerSingleton("bean3", new Bean3());
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()); beanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders);
AutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor(); processor.setBeanFactory(beanFactory);
Bean1 bean1 = new Bean1(); System.out.println(bean1);
processor.postProcessProperties(null, bean1, "bean1");
Method findAutowiringMetadata = AutowiredAnnotationBeanPostProcessor.class.getDeclaredMethod("findAutowiringMetadata", String.class, Class.class, PropertyValues.class); findAutowiringMetadata.setAccessible(true); InjectionMetadata metadata = (InjectionMetadata) findAutowiringMetadata.invoke(processor, "bean1", Bean1.class, null); System.out.println(metadata);
metadata.inject(bean1, "bean1", null);
System.out.println(bean1);
Field bean3 = Bean1.class.getDeclaredField("bean3"); DependencyDescriptor descriptor = new DependencyDescriptor(bean3, false); Object o = beanFactory.doResolveDependency(descriptor, null, null, null); System.out.println(o);
Method setBean2 = Bean1.class.getDeclaredMethod("setBean2", Bean2.class); DependencyDescriptor descriptor1 = new DependencyDescriptor( new MethodParameter(setBean2, 0), false ); Object o1 = beanFactory.doResolveDependency(descriptor1, null, null, null); System.out.println(o1);
Method setHome = Bean1.class.getDeclaredMethod("setHome", String.class); DependencyDescriptor descriptor2 = new DependencyDescriptor( new MethodParameter(setHome, 0), false ); Object o2 = beanFactory.doResolveDependency(descriptor2, null, null, null); System.out.println(o2); } }
|