Spring源碼解析-autowiring自動裝配的實現

   IoC容器提供了自動依賴裝配的方式,爲應用IoC容器提供很大的方便。在自動配置中,不需要顯式的去指定Bean屬性,只需要配置autowiring屬性,IoC容器會根據這個屬性配置,使用反射的方式查找屬性的類型或者名字,然後基於類型或名字來自動匹配IoC中的Bean,從而完成自動注入的工作。

      自動依賴注入的實現部分在AbstractAutowireCapableBeanFactory中的populateBean方法中

//進行依賴注入
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;
        }

對autowireMode進行判斷後分別調用autowireByName和autowireByType進行注入。

protected void autowireByName(
            String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
        for (String propertyName : propertyNames) {
            if (containsBean(propertyName)) {
//使用當前Bean的屬性名,在IoC容器中獲取對應的bean,讓將獲取的bean設置爲當前的Bean的屬性值。
                Object bean = getBean(propertyName);
                pvs.add(propertyName, bean);
                registerDependentBean(propertyName, beanName);
                if (logger.isDebugEnabled()) {
                    logger.debug("Added autowiring by name from bean name '" + beanName +
                            "' via property '" + propertyName + "' to bean named '" + propertyName + "'");
                }
            }
            else {
                if (logger.isTraceEnabled()) {
                    logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
                            "' by name: no matching bean found");
                }
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章