代码拉取完成,页面将自动刷新
同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
org.springframework.transaction.support.SimpleTransactionScope
在介绍方法之前先了解一些相关类
/**
* Holder for scoped objects.
*
* 作用域对象持有
*/
static class ScopedObjectsHolder {
/**
* 作用域实例
*/
final Map<String, Object> scopedInstances = new HashMap<>();
/**
* 摧毁回调map
*/
final Map<String, Runnable> destructionCallbacks = new LinkedHashMap<>();
}
这里需要了解对象 : TransactionSynchronizationManager
暂时不做了解
这里暂时了解到
内部还是一个map
其中解绑unbindResource
和绑定bindResource
都是对上述内部变量做操作.
了解上述方法后来看看整个类做了什么
/**
* 事务相关方法
*/
private class CleanupSynchronization extends TransactionSynchronizationAdapter {
/**
* 作用域对象持有
*/
private final ScopedObjectsHolder scopedObjects;
public CleanupSynchronization(ScopedObjectsHolder scopedObjects) {
this.scopedObjects = scopedObjects;
}
@Override
public void suspend() {
// 解绑
TransactionSynchronizationManager.unbindResource(SimpleTransactionScope.this);
}
@Override
public void resume() {
// 绑定
TransactionSynchronizationManager.bindResource(SimpleTransactionScope.this, this.scopedObjects);
}
/**
* 事务完成后需要执行的内容
* @param status
*/
@Override
public void afterCompletion(int status) {
// 解绑
TransactionSynchronizationManager.unbindResourceIfPossible(SimpleTransactionScope.this);
// 执行素有的回调方法
for (Runnable callback : this.scopedObjects.destructionCallbacks.values()) {
callback.run();
}
// 数据容器清除
this.scopedObjects.destructionCallbacks.clear();
this.scopedObjects.scopedInstances.clear();
}
}
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
// 事务管理器中获取 作用域对象容器
ScopedObjectsHolder scopedObjects = (ScopedObjectsHolder) TransactionSynchronizationManager.getResource(this);
if (scopedObjects == null) {
scopedObjects = new ScopedObjectsHolder();
// 设置空的作用域对象
TransactionSynchronizationManager.registerSynchronization(new CleanupSynchronization(scopedObjects));
// 绑定当前对象和 作用域对象容器
TransactionSynchronizationManager.bindResource(this, scopedObjects);
}
// 获取作用域对象的map容器
Object scopedObject = scopedObjects.scopedInstances.get(name);
if (scopedObject == null) {
// 从 object factory 创建
scopedObject = objectFactory.getObject();
// 获取作用域对象的map容器, 向里面插入数据
scopedObjects.scopedInstances.put(name, scopedObject);
}
return scopedObject;
}
在前文我们已经了解到 TransactionSynchronizationManager
存储的是一个MAP .
在这段代码中我们可以具象化存储内容
key: SimpleTransactionScope
value: ScopedObjectsHolder
get 方法本质上是两个map的嵌套
第一层是 TransactionSynchronizationManager
的 resource
map
第二层是 ScopedObjectsHolder
的 scopedInstances
map
@Override
@Nullable
public Object remove(String name) {
// 事务管理器中获取 作用域对象容器
ScopedObjectsHolder scopedObjects = (ScopedObjectsHolder) TransactionSynchronizationManager.getResource(this);
if (scopedObjects != null) {
// 摧毁回调容器删除 name
scopedObjects.destructionCallbacks.remove(name);
// 实例容器删除 name
return scopedObjects.scopedInstances.remove(name);
}
else {
return null;
}
}
第一步和 get
方法相同获取ScopedObjectsHolder
第二步删除 ScopedObjectsHolder
中摧毁时的回调容器中 name 对应的回调方法
删除实例容器中 name 对应的实例
@Override
public void registerDestructionCallback(String name, Runnable callback) {
ScopedObjectsHolder scopedObjects = (ScopedObjectsHolder) TransactionSynchronizationManager.getResource(this);
if (scopedObjects != null) {
scopedObjects.destructionCallbacks.put(name, callback);
}
}
@Override
@Nullable
public String getConversationId() {
return TransactionSynchronizationManager.getCurrentTransactionName();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。