通过Supplier回调的方式获取新实例的BeanWrapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
Object instance;

//当前创建的bean的名称,用于从用户指定的Supplier回调中触发的getBean等调用的隐式依赖项注册。
//NamedThreadLocal<String> currentlyCreatedBean
//获取原先创建bean的名字
String outerBean = this.currentlyCreatedBean.get();
this.currentlyCreatedBean.set(beanName);
try {
//得到一个结果。有点像工厂模式
instance = instanceSupplier.get();
} finally {
if (outerBean != null) {
//如果原先bean存在,将保存到currentlyCreatedBean中
this.currentlyCreatedBean.set(outerBean);
} else {
this.currentlyCreatedBean.remove();
}
}

//如果get()方法返回null,则创建NullBean对象
if (instance == null) {
//空bean实例的内部表示
instance = new NullBean();
}
//组装BeanWrapper
BeanWrapper bw = new BeanWrapperImpl(instance);
//初始化BeanWrapper
initBeanWrapper(bw);
return bw;
}

流程:

  • NamedThreadLocal中设置当前创建的bean名称
  • 通过Supplier接口中的get()方法获取bean对象
  • 如果获取的bean对象为null,则返回NullBean
  • 组装BeanWrapper:就是对bean的再一次封装,提供和获取和设置属性值的能力和获取属性描述符,查询属性的可读性/可写性。
  • 初始化BeanWrapper,这块逻辑后面还会经常接触,所以打算单独分析

在这看一看Supplier接口:

1
2
3
4
@FunctionalInterface
public interface Supplier<T> {
T get();
}

这个接口有点像工厂,通过设置Supplier,并调用get获取对象T;

1
2
3
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
}

tencent.jpg