问题记录
遇到的问题
/想在
static
方法调用Bean
对象的功能
static
只能调用static
代码
但是这样就注入不了Bean
对象null
// 错误代码 !!!!!!! @Resource private static RedisTemplate<String, String> redisTemplate // null; public static String getCookies() { // 注入失败 !!!!! 错误!!!!! String cookies = redisTemplate.opsForValue().get(REDISKEY);
@PostConstruct解决
解释:
@PostConstruct
是Java EE提供的一种在对象构造完成后立即执行特定操作
的注解。 当一个类被标注了@PostConstruct
注解后,在它的构造函数执行完毕之后,被标注的方法将会被自动调用
用处:
@PostConstruct
注解通常用于在对象构造完成后进行一些初始化操作,例如初始化资源、加载配置、建立连接
等。
这样可以确保在对象创建完成后立即执行一些必要的初始化工作
。
/**
* @Author abel_liq
* @Date 2024/1/26-16:58
* @Description
*/
// 给需要注入的`Bean`对象赋值到`新的静态变量`上使用
// 声明为Bean对象
@Component
public class sfUtils {
@Resource
// 正常注入的Bean对象
private RedisTemplate<String, String> redisTemplate;
// 被调用的静态对象
private static RedisTemplate<String, String> staticRedisTemplate;
// 在Bean对象初始化时执行init()方法
// @PostConstruct注解表示该方法会在Bean对象初始化完成后被调用
// 保证了能够正确初始化
@PostConstruct
private void init() {
staticRedisTemplate = this.redisTemplate;
}
public static String getCookies() {
// 可以正常使用了
String cookies = staticRedisTemplate.opsForValue().get(REDISKEY);
// xxxxx 业务逻辑
}
}
volatile关键字+ 双检锁 解决
想起了刚学java的时候 实现单例模式的 双检锁 这种方式也能解决这个问题
双重检查锁定是一种用于
延迟初始化
的经典设计模式,它结合了懒汉式单例模式和同步锁
的特性。通过双重检查锁定,可以在对象被创建时执行初 始化操作
。
/**
* @Author abel_liq
* @Date 2024/1/26-18:03
* @Description
*/
public class sfUtils {
private static volatile RedisTemplate<String, String> staticRedisTemplate;
public static RedisTemplate<String, String> getRedisTemplate() {
if (staticRedisTemplate == null) {
synchronized (sfUtils.class) {
if (staticRedisTemplate == null) {
staticRedisTemplate = new RedisTemplate<>(); // 初始化staticRedisTemplate
// 可以在这里进行一些初始化配置
}
}
}
return staticRedisTemplate;
}
public static String getCookies() {
RedisTemplate<String, String> redisTemplate = getRedisTemplate();
String cookies = redisTemplate.opsForValue().get(REDISKEY);
// 其他操作
return cookies;
}
}
声明为
volatile
,这样可以确保多线程环境下对其进行正确的读取和写入