1 Star 0 Fork 156

初雪12 / Spring-Analysis

forked from huifer / Code-Analysis 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Spring-DependencyObjectProvider.md 5.69 KB
一键复制 编辑 原始数据 按行查看 历史
huifer 提交于 2020-12-15 15:08 . feat: 0.0.12

Spring DependencyObjectProvider

  • 类全路径: org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider

成员变量

  • 先来阅读 DependencyObjectProvider 中的成员变量的相关信息
成员变量
	private class DependencyObjectProvider implements BeanObjectProvider<Object> {

    /**
     * 依赖描述
     */
    private final DependencyDescriptor descriptor;

    /**
     * 是否是 Optional 类型
     */
    private final boolean optional;

    @Nullable
    private final String beanName;
}

在成员变量中我们对 optional 变量多一点描述. 在构造函数中有下面这段代码 this.descriptor.getDependencyType() == Optional.class 这里是做类型判断.

方法分析

  • 在对成员变量了解后,下面开始对方法进行逐个分析.

getObject

  • 方法签名: org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider.getObject()
getObject 完整代码如下
		@Override
		public Object getObject() throws BeansException {
			// 获取bean实例
			// 是 optional 的情况下创建
			if (this.optional) {
				return createOptionalDependency(this.descriptor, this.beanName);
			}
			else {
				// 解析依赖进行创建对象
				Object result = doResolveDependency(this.descriptor, this.beanName, null, null);
				if (result == null) {
					throw new NoSuchBeanDefinitionException(this.descriptor.getResolvableType());
				}
				return result;
			}
		}

在 getObject 中有两者创建(获取)bean实例的方式. 1. 根据依赖类型是否是 Optional 做两种区分 1. true: createOptionalDependency 2. false: doResolveDependency

关于上述两个方法的分析请查看: DefaultListableBeanFactory

getObject

  • 方法签名: org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider.getObject(java.lang.Object...)
getObject 完整代码如下
    @Override
    public Object getObject(final Object... args) throws BeansException {
        // 获取bean实例
        // 是 optional 的情况下创建
        if (this.optional) {
            return createOptionalDependency(this.descriptor, this.beanName, args);
        }
        else {
            // 创建 依赖描述对象, 重写方法 resolveCandidate , 从容器(BeanFactory)中获取
            DependencyDescriptor descriptorToUse = new DependencyDescriptor(this.descriptor) {
                @Override
                public Object resolveCandidate(String beanName, Class<?> requiredType, BeanFactory beanFactory) {
                    return beanFactory.getBean(beanName, args);
                }
            };

            // 解析依赖进行创建对象
            Object result = doResolveDependency(descriptorToUse, this.beanName, null, null);
            if (result == null) {
                throw new NoSuchBeanDefinitionException(this.descriptor.getResolvableType());
            }
            return result;
        }
    }
  • 把这个方法和上一个方法对比, 可以发现两者的差异点是 DependencyDescriptor 类的resolveCandidate 被重写了,

  • 剩下的 getIfAvailablegetIfUniquegetValue 的处理方式也和上述方式相同, 重写了DependencyDescriptor 中的个别方法. 下面贴出代码

getIfAvailable、getIfUnique 、 getValue 详细代码
@Override
		@Nullable
		public Object getIfAvailable() throws BeansException {
			if (this.optional) {
				return createOptionalDependency(this.descriptor, this.beanName);
			}
			else {
				DependencyDescriptor descriptorToUse = new DependencyDescriptor(this.descriptor) {
					@Override
					public boolean isRequired() {
						return false;
					}
				};
				return doResolveDependency(descriptorToUse, this.beanName, null, null);
			}
		}

		@Override
		@Nullable
		public Object getIfUnique() throws BeansException {
			DependencyDescriptor descriptorToUse = new DependencyDescriptor(this.descriptor) {
				@Override
				public boolean isRequired() {
					return false;
				}

				@Override
				@Nullable
				public Object resolveNotUnique(ResolvableType type, Map<String, Object> matchingBeans) {
					return null;
				}
			};
			if (this.optional) {
				return createOptionalDependency(descriptorToUse, this.beanName);
			}
			else {
				return doResolveDependency(descriptorToUse, this.beanName, null, null);
			}
		}

		@Nullable
		protected Object getValue() throws BeansException {
			if (this.optional) {
				return createOptionalDependency(this.descriptor, this.beanName);
			}
			else {
				return doResolveDependency(this.descriptor, this.beanName, null, null);
			}
		}

下面来阅读 streamorderStream 两个方法

		@Override
		public Stream<Object> stream() {
			return resolveStream(false);
		}

		@Override
		public Stream<Object> orderedStream() {
			return resolveStream(true);
		}
  • 上述两个方法最终还是依靠下面的方法resolveStream
		@SuppressWarnings("unchecked")
		private Stream<Object> resolveStream(boolean ordered) {
			DependencyDescriptor descriptorToUse = new StreamDependencyDescriptor(this.descriptor, ordered);
			Object result = doResolveDependency(descriptorToUse, this.beanName, null, null);
			return (result instanceof Stream ? (Stream<Object>) result : Stream.of(result));
		}

除开 doResolveDependency 方法外仅有类型判断和 stream.of 两个作为返回值的控制

Java
1
https://gitee.com/chuxue12/spring-analysis.git
git@gitee.com:chuxue12/spring-analysis.git
chuxue12
spring-analysis
Spring-Analysis
master

搜索帮助