Spring框架学习[IoC容器高级特性](八)

2014-11-24 03:11:10 · 作者: · 浏览: 2
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); }
  • } }
  • } //根据类型对属性进行自动依赖注入
  • protected void autowireByType( String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
  • //获取用户定义的类型转换器 TypeConverter converter = getCustomTypeConverter();
  • if (converter == null) { converter = bw;
  • } //存放解析的要注入的属性
  • Set autowiredBeanNames = new LinkedHashSet (4); //对Bean对象中非简单属性(不是简单继承的对象,如8中原始类型,字符
  • //URL等都是简单属性)进行处理 String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
  • for (String propertyName : propertyNames) { try {
  • //获取指定属性名称的属性描述器 PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
  • //不对Object类型的属性进行autowiring自动依赖注入 if (!Object.class.equals(pd.getPropertyType())) {
  • //获取属性的setter方法 MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
  • //检查指定类型是否可以被转换为目标对象的类型 boolean eager = !PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass());
  • //创建一个要被注入的依赖描述 DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
  • //根据容器的Bean定义解析依赖关系,返回所有要被注入的Bean对象 Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
  • if (autowiredArgument != null) { //为属性赋值所引用的对象
  • pvs.add(propertyName, autowiredArgument); }
  • for (String autowiredBeanName : autowiredBeanNames) { //指定名称属性注册依赖Bean名称,进行属性依赖注入
  • registerDependentBean(autowiredBeanName, beanName); if (logger.isDebugEnabled()) {
  • logger.debug(Autowiring by type from bean name ' + beanName + ' via property ' + propertyName + ' to bean named ' + autowiredBeanName + ');
  • } }
  • //释放已自动注入的属性 autowiredBeanNames.clear();
  • } }
  • catch (BeansException ex) { throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
  • } }
  • }

    通过上面的源码分析,我们可以看出来通过属性名进行自动依赖注入的相对比通过属性类型进行自动依赖注入要稍微简单一些,但是真正实现属性注入的是DefaultSingletonBeanRegistry类的registerDependentBean方法。

    (3).DefaultSingletonBeanRegistry的registerDependentBean方法对属性注入:

    [java] view plaincopy
    1. //为指定的Bean注入依赖的Bean public void registerDependentBean(String beanName, String dependentBeanName) {
    2. //处理Bean名称,将别名转换为规范的Bean名称 String canonicalName = canonicalName(beanName);
    3. //多线程同步,保证容器内数据的一致性 //先从容器中:bean名称-->全部依赖Bean名称集合找查找给定名称Bean的依赖Bean
    4. synchronized (this.dependentBeanMap) { //获取给定名称Bean的所有依赖Bean名称
    5. Set dependentBeans = this.dependentBeanMap.get(canonicalName); if (dependentBeans == null) {
    6. //为Bean设置依赖Bean信息 dependentBeans = new LinkedHashSet (8);
    7. this.dependentBeanMap.put(canonicalName, dependentBeans); }
    8. //向容器中:bean名称-->全部依赖Bean名称集合添加Bean的依赖信息 //即,将Bean所依赖的Bean添加到容器的集合中
    9. dependentBeans.add(dependentBeanName); }
    10. //从容器中:bean名称-->指定名称Bean的依赖Bean集合找查找给定名称 //Bean的依赖Bean
    11. synchronized (this.dependenciesForBeanMap) { Set dependenciesForBean = this.dependenciesForBeanMap.get(dependentBeanName);
    12. if (dependenciesForBean == null) { dependenciesForBean = new LinkedHashSet (8);
    13. this.dependenciesForBeanMap.put(dependentBeanName, dependenciesForBean); }
    14. //向容