JAVA全系列 教程
3762个小节阅读:7088.2k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
bean的作用域是允许自定义的。
想要自定义scope,必须让自定义类实现org.springframework.beans.factory.config.Scope接口。接口中一共有5个方法。
在Spring框架内部,Scope接口有且只有一个实现类SimpleThreadScope,表示在同一个线程内Bean是单例的。
xxxxxxxxxx
// 实现Scope接口,这是自定义Scope的强制语法要求
public class SimpleThreadScope implements Scope {
// 定义日志对象
private static final Log logger = LogFactory.getLog(SimpleThreadScope.class);
// 创建一个ThreadLocal对象
// 线程变量类型为Map<String,Object>
private final ThreadLocal<Map<String, Object>> threadScope =
// ThreadLocal 名称为SimpleThreadScope
new NamedThreadLocal<>("SimpleThreadScope") {
@Override
protected Map<String, Object> initialValue() {
// 给线程变量初始化
return new HashMap<>();
}
};
// 每次从IoC容器获取Bean时会被触发
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
// 取到线程变量
Map<String, Object> scope = this.threadScope.get();
// 从Map中取出值
Object scopedObject = scope.get(name);
// 如果值为null,重试实例化
if (scopedObject == null) {
// 重新获取对象
scopedObject = objectFactory.getObject();
// 把对象放入到map中
scope.put(name, scopedObject);
}
// 返回对象,不返回后续操作空指针
return scopedObject;
}
@Override
@Nullable
public Object remove(String name) {
// 获取线程变量
Map<String, Object> scope = this.threadScope.get();
// 把指定name值从Map中移除
return scope.remove(name);
}
@Override
public void registerDestructionCallback(String name, Runnable callback) {
// 日志记录
logger.warn("SimpleThreadScope does not support destruction callbacks. " +
"Consider using RequestScope in a web environment.");
}
@Override
@Nullable
public Object resolveContextualObject(String key) {
// 没做任何处理
return null;
}
@Override
public String getConversationId() {
// 会话ID为当前线程的名字。
return Thread.currentThread().getName();
}
}