首页 > 数据库 >节假日配置初始化 redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类

节假日配置初始化 redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类

时间:2024-08-11 11:04:58浏览次数:12  
标签:cache java String GuavaUtils Cache PostConstruct static key public

节假日配置初始化 redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类

启动报错:本机,在jenkins上面没有报错?包括嵌套的注入Bean

java 静态代码块和spring @value等注解注入顺序
https://www.cnblogs.com/oktokeep/p/15530697.html

/**
* 节假日配置初始化 redis缓存,在项目启动运行时加载。
* 如果使用了StringRedisTemplate 在@PostConstruct在运行时启动会报错。
    解决方案:1.可以将该方法的注解@PostConstruct去掉。在程序实际运行中再初始化加载。不影响。
    2.或者更改缓存方案,可以使用本地化的com.google.common.cache.Cache来实现。 如:GuavaUtils.java工具类
**/
@Service
//@Component
public class HolidayInitService implements ApplicationContextAware {

    @Autowired
    private HolidayFeignApi holidayFeignApi;
    @Autowired
    private StringRedisTemplate redisTemplate;

    public static StringRedisTemplate stringRedisTemplate;

    private ApplicationContext applicationContext;
    

    /**
     * 运行时加载
     * @return
     */
    @PostConstruct
    public String getHolidaySettingByUrlNoCache() {
        //1.@Autowired注入方式
        System.out.println("stringRedisTemplate=" + redisTemplate);
        
        //2.静态类方式
        stringRedisTemplate = this.redisTemplate;
        System.out.println("stringRedisTemplate2=" + stringRedisTemplate);

        //3.applicationContext.getBean方式
        System.out.println("HolidayFeignApi=" + holidayFeignApi);
        HolidayFeignApi holidayFeignApi = applicationContext.getBean(HolidayFeignApi.class);
        System.out.println("HolidayFeignApi2=" + holidayFeignApi);
        
        //以上3种方式都可以正常的注入BEAN
        
        String json = null;
        //测试: HolidayFeignApi 这个类调用方法可以正常启动。   获取json
        //运行这一行启动会报错。
        stringRedisTemplate.opsForValue().set(holidayKey, json,1, TimeUnit.DAYS);
        
        return json;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
# 需要的jar包 guava-19.0.jar
package com.example.core.mydemo.cache;

import com.google.common.cache.CacheBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;

public class GuavaUtils {
    private final static Logger logger = LoggerFactory.getLogger(GuavaUtils.class);


    final static Cache<String, String> cache =
            CacheBuilder.newBuilder()
                    //设置cache的初始大小为10,要合理设置该值
                    .initialCapacity(10)
                    //设置并发数为5,即同一时间最多只能有5个线程往cache执行写入操作
                    .concurrencyLevel(5)
                    //设置cache中的数据在写入之后的存活时间为2个小时
                    .expireAfterWrite(2 * 60 * 60, TimeUnit.SECONDS)
                    //设置缓存的移除通知
                    .removalListener(notification -> {
                        logger.info("", "", notification.getKey() + " " + notification.getValue() + " 被移除,原因:" + notification.getCause());
                    }).build();

    public static void setKeyVal(String key, String value) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
            return;
        }
        cache.put(key, value);
    }

    public static String getValByKey(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        String value = cache.getIfPresent(key);
        return value;
    }

    public static void delKey(String key) {
        if (StringUtils.isEmpty(key)) {
            return;
        }
        cache.invalidate(key);
    }

    public static void main(String[] args) {
        GuavaUtils.setKeyVal("myOrderKey","123456789");
        System.out.println("value=" + GuavaUtils.getValByKey("myOrderKey"));

        GuavaUtils.delKey("myOrderKey");
        System.out.println("value2=" + GuavaUtils.getValByKey("myOrderKey"));
    }
}

springboot用@Autowired和@PostConstruct注解把config配置读取到bean变成静态方法
public static Configs conf;

@Autowired
private Configs conf2;

@PostConstruct
public void initconf(){
conf = conf2;
}


原理剖析: spring不能注入static对象
静态变量、类变量不是对象的属性,而是一个类的属性,所以静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,
spring注入是在容器中实例化对象,所以不能使用静态方法。

而使用静态变量、类变量扩大了静态方法的使用范围。静态方法在spring是不推荐使用的,依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易。

一旦你使用静态方法,就不再需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例,
这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做。

 

标签:cache,java,String,GuavaUtils,Cache,PostConstruct,static,key,public
From: https://www.cnblogs.com/oktokeep/p/18353180

相关文章

  • Java开发环境安装笔记
    目录JDK的版本Java8Java9Java11(LTS)Java17(LTS)Java21JDK的环境变量设置JAVAHOME和PATH环境变量CLASSPATH环境变量多个SDK版本切换又双叒叕换了一个电脑,又双叒叕得重新折腾各种软件的安装,记录一下吧...软件安装中,最麻烦的莫过于JAVA的编程环境安装了,Java运行环境区......
  • java.time.OffsetTime类
    java.time.OffsetTime类表示在ISO-8601日历系统中与UTC/Greenwich的偏移量的时间,例如:10:15:30+01:00。类声明以下是java.time.OffsetTime类的声明-publicfinalclassOffsetTimeextendsObjectimplementsTemporal,TemporalAdjuster,Comparable<OffsetTim......
  • java.time.OffsetDateTime类
    java.time.OffsetDateTime类表示ISO-8601日历系统中与UTC/Greenwich的偏移量的日期时间,例如2007-12-03T10:15:30+01:00。类声明以下是java.time.OffsetDateTime类的声明-publicfinalclassOffsetDateTimeextendsObjectimplementsTemporal,TemporalAdjust......
  • Java工具类封装微服务间HTTP通信
    在微服务架构中,服务之间通常通过HTTP协议进行通信。为了简化这一过程,我们可以创建一些工具类来封装HTTP请求的发送逻辑。本篇文章将介绍如何使用Java来创建这样的工具类,并分别演示使用ApacheHttpClient和SpringFramework中的RestTemplate来发送HTTPGET请求的方法。1.引言......
  • Java计算机毕业设计律所管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着法律服务行业的快速发展,律师事务所面临着日益复杂的业务管理和运营挑战。传统的手工管理方式已难以满足律所高效、精准、透明的管理需求。律师的......
  • Java计算机毕业设计美丽校园打卡系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着信息技术的飞速发展与教育理念的持续革新,智慧校园建设已成为提升学校管理水平、增强学生参与度及保障师生健康安全的重要途径。在当前全球公共卫......
  • Java计算机毕业设计客户管理平台的设计及实现(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着市场竞争的日益激烈,企业对于客户关系管理的重视程度不断提升。传统的客户管理方式已难以满足企业精准营销、个性化服务及高效沟通的需求。在数字......
  • Java计算机毕业设计酒店管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着旅游业的蓬勃发展,酒店行业作为其中的重要组成部分,面临着日益激烈的市场竞争和客户需求多样化的挑战。传统的手工管理模式已难以适应酒店业务规模......
  • Java项目【尚庭公寓】从0开始Java项目实战(一)
    Java项目【尚庭公寓】从0开始Java项目实战(一)1.项目介绍1.1项目业务概述1.2移动端介绍1.3后台管理系统1.4核心业务流程1.5项目技术概述1.6数据库设计2.项目初始化准备2.1导入数据库2.2创建工程2.3项目初始配置2.3.1SpringBoot依赖配置2.3.2创建application.......
  • Java计算机毕业设计烬燃电竞酒店管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着电子竞技产业的蓬勃发展,电竞酒店作为一种新兴住宿业态迅速崛起,它不仅满足了电竞爱好者对高配置游戏硬件的需求,还融合了传统酒店的舒适住宿体验。......