以上就是自动装配的过程,再次回到填充属性的方法,进行小小的收尾
// 如果不是xml byName byType 方式,其他方式pvs皆是空值 if (pvs != null) { // 调用set方法赋值 applyPropertyValues(beanName, mbd, bw, pvs); } protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) { // 使用反射给属性赋值 bw.setPropertyValues(new MutablePropertyValues(deepCopy)); }填充属性过程,over~
初始化过程
initializeBean protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd){ // 如果bean实现了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口 // 则进行回调相应的方法 invokeAwareMethods(beanName, bean); // 第七次 在bean的初始化前进行处理 // 调用@PostConstruct注解的方法,Aware接口的回调方法 wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); // 调用初始化方法 // 如果bean实现了InitializingBean接口,则调用afterPropertiesSet方法 // 如果bean还实现了自定义的初始化方法,也进行调用 // 先afterPropertiesSet,再自定义 invokeInitMethods(beanName, wrappedBean, mbd); // 第八次 处理初始化后的bean wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); }以上为初始化中的大概流程,接下来我们一个个分析
首先是invokeAwareMethods private void invokeAwareMethods(String beanName, Object bean) { // 以下过程一目了然,就不过多分析了 if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { ((BeanNameAware) bean).setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { ClassLoader bcl = getBeanClassLoader(); if (bcl != null) { ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl); } } if (bean instanceof BeanFactoryAware) { ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); } } } applyBeanPostProcessorsBeforeInitialization public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName){ Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { // ImportAwareBeanPostProcessor处理ImportAware接口 // InitDestroyAnnotationBeanPostProcessor处理@PostContrust注解 // ApplicationContextAwareProcessor处理一系列Aware接口的回调方法 Object current = processor.postProcessBeforeInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; }