欢迎访问我的个人博客休息的风
上一篇spring系列博客spring 源码学习笔记(一)—— spring ioc 之加载XML转换为BeanDefinition讲到spring如何将xml文件转换为内存的数据结构。本篇博客将继续上篇博客,继续分析如何利用beanDefinition创建bean对象,并且对对象进行依赖注入。
下图是整个创建bean并依赖注入的过程:(看不清可右击在新页签进行查看)
AbstractAutowireCapableBeanFactory为创建bean的核心类,很多操作都在这个类里实现;我们主要关注这个类的方法。createBean方法作为入口
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { if (logger.isDebugEnabled()) { logger.debug("Creating instance of bean '" + beanName + "'"); } //这里的RootBeanDefinition就是之前从xml解析转换的内存数据结构 RootBeanDefinition mbdToUse = mbd; //省略代码。。。。 try { // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. //这里会去调用BeanPostProcessorsBeforeInstantiation, // 包括用于aop的AnnotationAwareAspectJAutoProxyCreator处理器 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { return bean; } } //省略代码。。。。 try { Object beanInstance = doCreateBean(beanName, mbdToUse, args); if (logger.isDebugEnabled()) { logger.debug("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; }
doCreateBean方法用于真正创建bean实例
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { //创建bean包装类实例 instanceWrapper = createBeanInstance(beanName, mbd, args); } final Object bean = instanceWrapper.getWrappedInstance(); Class> beanType = instanceWrapper.getWrappedClass(); if (beanType != NullBean.class) { mbd.resolvedTargetType = beanType; } //省略代码。。。 // Initialize the bean instance. Object exposedObject = bean; try { //填充RootBeanDefinition的字段 populateBean(beanName, mbd, instanceWrapper); //初始化bean exposedObject = initializeBean(beanName, exposedObject, mbd); }
createBeanInstance方法创建的是bean的包装类实例BeanWrapperImpl。后面populateBean方法中,需要通过这个包装类进行依赖注入。
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { PropertyValues pvs = mbd.getPropertyValues(); //省略代码。。。。 if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; //这里进行实例的后置处理,aop的AnnotationAwareAspectJAutoProxyCreator也在这里调用 if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { continueWithPropertyPopulation = false; break; } } } } if (!continueWithPropertyPopulation) { return; } if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // Add property values based on autowire by name if applicable. //通过名称自动装配 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } // Add property values based on autowire by type if applicable. //通过类自动装配 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } //省略代码。。。。 //设置属性值 applyPropertyValues(beanName, mbd, bw, pvs); }
这里只是在beanDefinition层面上注入,调用initializeBean方法开始对象的初始化。
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction
到此,基本的依赖注入过程已成形,这里总结一下整个过程:调用实例化前置处理器->创建包装类,对beanDefinition进行属性填充->根据beanDefinition进行初始化->初始化前后分别调用各自的处理器,初始时调用afterPropertiesSet->返回单例注册到DefaultListableBeanFactory中