该类实现了ConfigurableBootstrapContext接口,因此具有ConfigurableBootstrapContext的所有功能。
该类中有三个属性:
//存放InstanceSupplier对象,该对象用来获取实际对象,也就是说用该对象创建实际对象
private final Map<Class<?>, InstanceSupplier<?>> instanceSuppliers = new HashMap<>();
//存放实际的单例对象
private final Map<Class<?>, Object> instances = new HashMap<>();
//事件广播器
private final ApplicationEventMulticaster events = new SimpleApplicationEventMulticaster();
//向注册表注册特定类型。如果指定的类型已注册,但尚未作为单例获得,则将替换它。
@Override
public <T> void register(Class<T> type, InstanceSupplier<T> instanceSupplier) {
register(type, instanceSupplier, true);
}
//如果尚未注册特定类型,请向注册表注册该类型。
@Override
public <T> void registerIfAbsent(Class<T> type, InstanceSupplier<T> instanceSupplier) {
register(type, instanceSupplier, false);
}
//实际执行的注册方法
private <T> void register(Class<T> type, InstanceSupplier<T> instanceSupplier, boolean replaceExisting) {
Assert.notNull(type, "Type must not be null");
Assert.notNull(instanceSupplier, "InstanceSupplier must not be null");
//加锁,有可能有多个线程同时操作注册中心,而Map类型是线程不安全的,所以需要加锁
synchronized (this.instanceSuppliers) {
//判断instanceSuppliers 注册表中是否存在该类型
boolean alreadyRegistered = this.instanceSuppliers.containsKey(type);
//如果需要用新的值替换旧的值或者该类型在注册表中不存在,那么向注册表中注册该特定类型。
if (replaceExisting || !alreadyRegistered) {
Assert.state(!this.instances.containsKey(type), () -> type.getName() + " has already been created");
this.instanceSuppliers.put(type, instanceSupplier);
}
}
}
// 如果给定类型存在注册,则返回true,否则返回false
@Override
public <T> boolean isRegistered(Class<T> type) {
//有可能有多个线程同时操作注册中心,而Map类型是线程不安全的,所以需要加锁
synchronized (this.instanceSuppliers) {
//判断指定类型是否存在
return this.instanceSuppliers.containsKey(type);
}
}
//返回给定类型的任何现有InstanceSupplier
@Override
@SuppressWarnings("unchecked")
public <T> InstanceSupplier<T> getRegisteredInstanceSupplier(Class<T> type) {
//有可能有多个线程同时操作注册中心,而Map类型是线程不安全的,所以需要加锁
synchronized (this.instanceSuppliers) {
// 返回给定类型的任何现有InstanceSupplier
return (InstanceSupplier<T>) this.instanceSuppliers.get(type);
}
}
// 添加一个ApplicationListener,当BootstrapContext关闭且ApplicationContext已准备好时,将使用BootstrapContextClosedEvent调用它。
// 可用于添加一个监听器,该监听器可在BootstrapContext已关闭且ApplicationContext已完全准备好时执行操作。例如,一个实例可以选择将自己注册为一个普通的Springbean,以便应用程序可以使用它。
@Override
public void addCloseListener(ApplicationListener listener) {
this.events.addApplicationListener(listener);
}
// 如果类型已注册,则从上下文返回实例。如果以前没有访问过该实例,则将创建该实例。
public <T> T get(Class<T> type) throws IllegalStateException {
return getOrElseThrow(type, () -> new IllegalStateException(type.getName() + " has not been registered"));
}
// 如果类型已注册,则从上下文返回实例。如果以前没有访问过该实例,则将创建该实例。如果类型没有被注册,则返回指定的其他实例。
@Override
public <T> T getOrElse(Class<T> type, T other) {
return getOrElseSupply(type, () -> other);
}
//如果类型已注册,则从上下文返回实例。如果以前没有访问过该实例,则将创建该实例。如果类型没注册通过Supplier新建一个对象实例。
@Override
public <T> T getOrElseSupply(Class<T> type, Supplier<T> other) {
//加锁,有可能有多个线程同时操作注册中心,而Map类型是线程不安全的,所以需要加锁
synchronized (this.instanceSuppliers) {
//从InstanceSupplier注册表中获取InstanceSupplier实例
InstanceSupplier<?> instanceSupplier = this.instanceSuppliers.get(type);
//如果该类型在注册表中存在,则获取该类型的实例,否则返回该类型指定的其他实例。
return (instanceSupplier != null) ? getInstance(type, instanceSupplier) : other.get();
}
}
// 如果类型已注册,则从上下文返回实例。如果以前没有访问过该实例,则将创建该实例。如果类型没有注册则抛出异常。
@Override
public <T, X extends Throwable> T getOrElseThrow(Class<T> type, Supplier<? extends X> exceptionSupplier) throws X {
//加锁,有可能有多个线程同时操作注册中心,而Map类型是线程不安全的,所以需要加锁
synchronized (this.instanceSuppliers) {
//从InstanceSupplier注册表中获取InstanceSupplier实例
InstanceSupplier<?> instanceSupplier = this.instanceSuppliers.get(type);
// 如果该类型没有注册,抛出指定异常
if (instanceSupplier == null) {
throw exceptionSupplier.get();
}
return getInstance(type, instanceSupplier);
}
}
//获取指定类型的实例
@SuppressWarnings("unchecked")
private T getInstance(Class type, InstanceSupplier instanceSupplier) {
// 从实例注册表中获取该类型对应的实例
T instance = (T)this.instances.get(type);
//如果实例注册表中不存在该实例
if (instance ==null) {
//从该类型对应的实例工厂中获取该类型的实例
instance = (T) instanceSupplier.get(this);
//判断该类型是不是单例,如果是单例的化,将该类型对应的实例存放到实例注册表中
if (instanceSupplier.getScope() == Scope.SINGLETON) {
this.instances.put(type, instance);
}
}
return instance;
}
// 发布关闭BootstrapContext并准备ApplicationContext的事件
// 方法在关闭BootstrapContext并准备ApplicationContext时调用。
public void close(ConfigurableApplicationContext applicationContext) {
this.events.multicastEvent(new BootstrapContextClosedEvent(this, applicationContext));
}