1.ObjectFactory的实现类
ObjectFactory在Spring中提供的是延迟依赖查找的功能,(具体演示先跳过,感兴趣可以自己试试),而ObjectFactroy有两个比较重要的实现类,一个是org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory ,
另一个则是org.springframework.beans.factory.support.DefaultListableBeanFactory.DependencyObjectProvider#DependencyObjectProvider
接下来主要研究这两个类
2.TargetBeanObjectFactory
在我们xml进行bean的装配时,只能装配一个名为org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean的类,而这个类最终会给我们返回它的内部类TargetBeanObjectFactory,也就是我们标题所提到的类
<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName" value="user"></property>
</bean>
public class ObjectFactoryCreatingFactoryBean extends AbstractFactoryBean<ObjectFactory<Object>> {
@Nullable
private String targetBeanName;
@Override
protected ObjectFactory<Object> createInstance() {
BeanFactory beanFactory = getBeanFactory();
Assert.state(beanFactory != null, "No BeanFactory available");
Assert.state(this.targetBeanName != null, "No target bean name specified");
return new TargetBeanObjectFactory(beanFactory, this.targetBeanName);
}
@SuppressWarnings("serial")
private static class TargetBeanObjectFactory implements ObjectFactory<Object>, Serializable {
private final BeanFactory beanFactory;
private final String targetBeanName;
public TargetBeanObjectFactory(BeanFactory beanFactory, String targetBeanName) {
this.beanFactory = beanFactory;
this.targetBeanName = targetBeanName;
}
@Override
public Object getObject() throws BeansException {
return this.beanFactory.getBean(this.targetBeanName);
}
}
}
因此我们发现,当我们依赖查找 objectFactory 并调用objectFactory.getObject() 方法时,其底层实际上是通过beanFactory.getBean() 方法来实现的
因此我们得出结论:ObjectFactory查找过程实质上是BeanFactory的查找过程
3.DependencyObjectProvider
当我们进行依赖注入时,其底层会为我们返回 DefaultListableBeanFactory 的内部类 DependencyObjectProvider
@Override
@Nullable
// 依赖注入相关源码
public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
if (Optional.class == descriptor.getDependencyType()) {
return createOptionalDependency(descriptor, requestingBeanName);
}
/*
* 这里,如果我们注入的类型是ObjectFactory或ObjectProvider时,
* 会给我们返回 DependencyObjectProvider 这个对象
*/
else if (ObjectFactory.class == descriptor.getDependencyType() ||
ObjectProvider.class == descriptor.getDependencyType()) {
return new DependencyObjectProvider(descriptor, requestingBeanName);
}
知道了 DependencyObjectProvider 的来源,接下来我们研究一下 DependencyObjectProvider 的 getObject() 方法
private class DependencyObjectProvider implements BeanObjectProvider<Object> {
//不是本文的重要代码我们先跳过
@Override
public Object getObject() throws BeansException {
if (this.optional) {
return createOptionalDependency(this.descriptor, this.beanName);
}
else {
/*
* 这里,DependencyObjectProvider只有在调用getObject()方法时,
* 才会去对进行延迟依赖查找的对象进行依赖处理
*/
Object result = doResolveDependency(this.descriptor, this.beanName, null, null);
if (result == null) {
throw new NoSuchBeanDefinitionException(this.descriptor.getResolvableType());
}
return result;
}
}
}
从 DependencyObjectProvider 的源码我们发现,只有当我们在调用objectFactory.getObject() 方法时,DependencyObjectProvider 才会为我们需要的对象进行处理,因此拥有依赖延迟处理的能力。
4.总结
本文我们通过objectFactory的两个重要的实现类进行简单的分析,大致得出两个结论:
- objectFactory.getObject() 其底层是通过 beanFactory.getBean() 来实现的
- objectFactory 提供延迟依赖处理是因为只有在 objectFactory.getObject() 时才会对我们所需要的依赖进行处理
- 本文只是个人学习笔记,有说得不正确的地方希望各位大佬指出