Spring Boot启动项目时如何加载缓存

在SpringBoot项目中,执行启动时的初始化工作(如加载缓存)是一个常见的需求。可以通过多种方式实现,包括使用@PostConstruct注解、实现ApplicationRunner或CommandLineRunner接口,以及监听Spring的生命周期事件。下面详细介绍这些方法,并给出相应的代码示例。

方法一:使用 @PostConstruct 注解

@PostConstruct注解可以用来标记一个方法,在依赖注入完成后立即执行。这个方法在Spring容器初始化完毕后自动调用,非常适合做一些初始化工作。

java 复制代码
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class CacheLoader {

    @PostConstruct
    public void loadCache() {
        // 初始化缓存
        System.out.println("Loading cache at startup...");
        // 例如:缓存某些数据
    }
}

方法二:实现 CommandLineRunner 接口

实现CommandLineRunner接口的run方法,SpringBoot启动时会调用这个方法,适合用来执行启动时的初始化任务。

java 复制代码
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class CacheLoader implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 初始化缓存
        System.out.println("Loading cache at startup...");
        // 例如:缓存某些数据
    }
}

方法三:实现 ApplicationRunner 接口

与CommandLineRunner类似,ApplicationRunner接口也是在SpringBoot启动完成后调用,但提供了更为丰富的ApplicationArguments对象,可以用于处理传入的命令行参数。

java 复制代码
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class CacheLoader implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 初始化缓存
        System.out.println("Loading cache at startup...");
        // 例如:缓存某些数据
    }
}

方法四:监听 Spring 的生命周期事件

通过实现ApplicationListener接口或使用@EventListener注解,监听 ApplicationReadyEvent事件,在SpringBoot启动完成后执行初始化工作。

java 复制代码
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class CacheLoader implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // 初始化缓存
        System.out.println("Loading cache at startup...");
        // 例如:缓存某些数据
    }
}

或者使用 @EventListener 注解:

java 复制代码
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class CacheLoader {
    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        // 初始化缓存
        System.out.println("Loading cache at startup...");
        // 例如:缓存某些数据
    }
}

选择合适的方法

选择哪种方法取决于具体的需求和使用场景:

  • 如果初始化工作是一个Bean的属性,则推荐使用@PostConstruct注解。

  • 如果需要访问命令行参数,推荐使用ApplicationRunner或CommandLineRunner。

  • 如果需要监听应用上下文事件,推荐使用ApplicationListener或 @EventListener。

示例:加载缓存数据

假设我们要在应用启动时加载一些用户数据到缓存中,以下是一个完整的示例:

示例代码

bash 复制代码
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CacheLoader implements CommandLineRunner {
    private Map<Integer, String> userCache = new HashMap<>();
    @Override
    public void run(String... args) throws Exception {
        // 模拟从数据库加载用户数据到缓存
        userCache.put(1, "Alice");
        userCache.put(2, "Bob");
        userCache.put(3, "Charlie");
        System.out.println("User cache loaded at startup: " + userCache);
    }
    public String getUserById(int userId) {
        return userCache.get(userId);
    }
}

测试类

bash 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CacheLoaderApplication implements CommandLineRunner {
    @Autowired
    private CacheLoader cacheLoader;
    public static void main(String[] args) {
        SpringApplication.run(CacheLoaderApplication.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        // 测试缓存数据
        System.out.println("User with ID 1: " + cacheLoader.getUserById(1));
        System.out.println("User with ID 2: " + cacheLoader.getUserById(2));
        System.out.println("User with ID 3: " + cacheLoader.getUserById(3));
    }
}

通过以上方式,可以确保在SpringBoot项目启动时执行必要的初始化工作,如加载缓存数据,从而提高应用的性能和响应速度。

相关推荐
Dcs14 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing20 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者31 分钟前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea
考虑考虑1 小时前
Maven 依赖范围(Scope)
java·后端·maven