代码拉取完成,页面将自动刷新
同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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
这里是做类型判断.
org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider.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
org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider.getObject(java.lang.Object...)
@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
被重写了,
剩下的 getIfAvailable
、getIfUnique
、 getValue
的处理方式也和上述方式相同, 重写了DependencyDescriptor
中的个别方法. 下面贴出代码
@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);
}
}
下面来阅读 stream
和 orderStream
两个方法
@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
两个作为返回值的控制
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。