IoC容器提供了自動依賴裝配的方式,爲應用IoC容器提供很大的方便。在自動配置中,不須要顯式的去指定Bean屬性,只須要配置autowiring屬性,IoC容器會根據這個屬性配置,使用反射的方式查找屬性的類型或者名字,而後基於類型或名字來自動匹配IoC中的Bean,從而完成自動注入的工做。app
自動依賴注入的實現部分在AbstractAutowireCapableBeanFactory中的populateBean方法中spa
//進行依賴注入 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進行注入。debug
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"); } } } }