SpringBoot缓存系统常量数据

一、SpringBoot中常量数据的配置

在使用SpringBoot实现项目时,总是存在一些需要配置的常量信息,例如相册系统中中配置相册文件夹的位置、配置相册默认存储大小等,又例如考勤系统中配置考勤时间等等。

这些常量数据有3种方法实现。
1、直接写死在代码里。通过public final static定义一个常量,然后使用该常量。 如果需要修改变量值,需要修改JAVA代码,需要重新编译成war包或jar包。对于真常量、不会发生变化的情形可以使用该方式。

2、写在配置文件中,例如直接写在application.yml中。这种方法中如果要修改配置,需要修改war包或jar包中的配置文件,虽然不需要重新编译JAVA代码,但涉及修改代码包,也是不安全的操作。

3、将可能会变动的配置放在数据库中,在启动项目时去数据库中读取常量信息,然后缓存成为JAVA对象,全局都可以使用。如果修改常量值,直接修改数据库即可。

以上三种方法修改之后,都需要重新启动项目。针对在不同情况下可能需要自定义人工赋值的常量,推荐使用第三种方法,下面具体讲解这种使用数据库缓存常量数据的实现方式。

二、使用数据库实现常量数据缓存

(一)创建系统常量表sys_config

在这里插入图片描述

(二)读取数据

创建常量封装类

//常量封装类需要使用@Component注入到SpringBoot容器池中
//使用@Data代替setter和getter的实现
@Data
@Component
public class SystemConstants {
    public String attendanceStartTime;
    public String attendanceTime;
    public String attendanceEndTime;
    public String closingStartTime;
    public String closingTime;
    public String closingEndTime;
}

声明Dao层抽象方法

@Mapper
public interface SysConfigDao {
    public List<SysConfig> selectAllParam();
}

对应的sql如下

<select id="selectAllParam" resultType="com.example.emos.wx.db.pojo.SysConfig">
	SELECT param_key, param_value FROM sys_config WHERE status = 1;
</select>

在启动类中创建sysInit方法,读取常量数据并缓存。

此处使用的SpringBoot中的Bean初始化方法的@PostConstruct注解来实现。在执行顺序上, 构造方法-> @Autowired-> @PostConstruct。在Bean初始化之后(构造方法和@Autowired之后)才会执行@PostConstruct注解下的指定操作,这样保证@PostConstruct注解下可以使用SpringBoot容器中已经注入的对象。

@SpringBootApplication
@ServletComponentScan
@Slf4j
public class EmosWxApiApplication {
    @Autowired
    private SysConfigDao sysConfigDao;

    @Autowired
    private SystemConstants constants;

    public static void main(String[] args) {
        SpringApplication.run(EmosWxApiApplication.class, args);
    }

    @PostConstruct
    public void sysInit() {
        List<SysConfig> list = sysConfigDao.selectAllParam();
        list.forEach(one -> {
            String key = one.getParamKey();
            key = StrUtil.toCamelCase(key);
            String value = one.getParamValue();
            try {
                Field field = constants.getClass().getDeclaredField(key);
                field.set(constants, value);
            } catch (Exception e) {
                log.error("执行异常", e);
            }
        });

    }
}

以上代码,首先在启动类中注入了一个SystemConstants类的Bean,注入这个bean之后,在sysInit方法中通过反射给这个对象的成员变量赋值,然后就可以全局使用该对象,获取对应的常量值了。

为什么可以直接全局使用呢,这是很好的利用了SpringBoot中依赖注入中的单例模式。在Spring中Bean的作用域总共定义了6种,其中默认为单例模式(Singleton),也就是在每个Spring IOC容器中,一个JAVA类只会有唯一的一个bean实例。

所以,从SpringBoot启动之后,通过反射首先给这个配置类进行了赋值。之后在其他任何地方使用的这个对象,都是同一个对象,也就是成员变量的值都是同一个,所以也就是全局可以共享常量值。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Spring Boot 中使用 Redis 缓存列表数据可以使用 RedisTemplate 对象来实现。下面是一个简单的示例: 首先,在 pom.xml 文件中添加 Redis 和 Spring Data Redis 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后,在 application.properties 文件中配置 Redis: ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 接下来,创建一个 RedisListService 类,用于操作 Redis 中的列表数据: ```java @Service public class RedisListService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void addToList(String key, Object value) { redisTemplate.opsForList().rightPush(key, value); } public List<Object> getList(String key) { return redisTemplate.opsForList().range(key, 0, -1); } public Object popFromList(String key) { return redisTemplate.opsForList().leftPop(key); } } ``` 在上面的代码中,我们使用了 RedisTemplate 对象的 opsForList() 方法来获取操作 Redis 列表的方法。其中,rightPush() 方法用于将一个元素添加到列表的尾部,range() 方法用于获取列表的所有元素,leftPop() 方法用于弹出列表的第一个元素。 最后,我们可以在其他类中使用 RedisListService 对象来操作 Redis 列表数据: ```java @Autowired private RedisListService redisListService; public void testRedisList() { // 添加元素到列表 redisListService.addToList("mylist", "value1"); redisListService.addToList("mylist", "value2"); // 获取列表中的所有元素 List<Object> list = redisListService.getList("mylist"); System.out.println(list); // [value1, value2] // 弹出列表中的第一个元素 Object obj = redisListService.popFromList("mylist"); System.out.println(obj); // value1 } ``` 在上面的代码中,我们首先添加了两个元素到列表中,然后获取了列表中的所有元素并打印出来,最后弹出了列表中的第一个元素并打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值