Java类初始化操作的两种方式:@PostConstruct和双重检查锁与volatile的比较

4 篇文章 1 订阅
2 篇文章 1 订阅

问题记录

遇到的问题

/想在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,这样可以确保多线程环境下对其进行正确的读取和写入

记录平时遇到的问题,如果有错误,还请指正

要是帮助了您一点,还望您点个赞,共同进步!

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值