springboot启动加载

简介: springboot启动加载

应用启动完成之前或者之后,我们需要拿数据库中的一些数据加载到本地缓存中。这些数据一般都是不经常变更而且有被经常读取的,并且数据量不是很大的。这样操作可以减少一些数据库的压力。下面是我们常用的实现方式,具体的要用那种,看对应各自应用的设计和需求。

使用@PostConstruct注解

在需要加载数据的组件中,可以使用@PostConstruct注解的方法,该方法会在Spring容器初始化该类之后自动调用

import javax.annotation.PostConstruct;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CacheInitializer {  
  
    @Autowired  
    private YourRepository yourRepository; // 假设你有一个访问数据库的Repository  
  
    @Autowired  
    private CacheManager cacheManager; // 假设你使用Spring Cache进行缓存管理  
  
    @PostConstruct  
    public void init() {  
        // 从数据库中获取数据  
        List<YourData> dataList = yourRepository.findAll();  
  
        // 将数据加载到缓存中  
        dataList.forEach(data -> {  
            cacheManager.getCache("yourCacheName").put(data.getId(), data);  
        });  
    }  
}

实现InitializingBean接口

它只包含一个方法 afterPropertiesSet()。当一个 bean 的所有属性都被 Spring 容器设置之后(即通过依赖注入),afterPropertiesSet() 方法会被自动调用

import org.springframework.beans.factory.InitializingBean;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CacheInitializingBean implements InitializingBean {  
  
    @Autowired  
    private YourRepository yourRepository; // 假设你有一个访问数据库的Repository  
  
    @Autowired  
    private CacheManager cacheManager; // 假设你使用Spring Cache进行缓存管理  
  
    @Override  
    public void afterPropertiesSet() throws Exception {  
        // 在所有属性被设置之后,执行此方法  
        // 从数据库中获取数据并加载到缓存中  
        List<YourData> dataList = yourRepository.findAll();  
        dataList.forEach(data -> {  
            cacheManager.getCache("yourCacheName").put(data.getId(), data);  
        });  
    }  
}

注:使用 InitializingBean 接口与使用 @PostConstruct 注解的效果类似,但它们在 Spring 生命周期中的调用时机略有不同。@PostConstruct 注解的方法是在依赖注入完成后立即调用,而 InitializingBeanafterPropertiesSet() 方法则是在所有属性被设置之后调用。在大多数情况下,这两个选项可以互换使用,具体选择哪个取决于你的个人喜好和项目需求。

实现CommandLineRunner接口

CommandLineRunner接口提供了一个run方法,该方法会在Spring Boot应用启动后立即执行。

import org.springframework.boot.CommandLineRunner;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CacheRunner implements CommandLineRunner {  
  
    @Autowired  
    private YourRepository yourRepository;  
  
    @Autowired  
    private CacheManager cacheManager;  
  
    @Override  
    public void run(String... args) throws Exception {  
        // 从数据库中获取数据并加载到缓存中  
        List<YourData> dataList = yourRepository.findAll();  
        dataList.forEach(data -> {  
            cacheManager.getCache("yourCacheName").put(data.getId(), data);  
        });  
    }  
}

实现ApplicationRunner接口

ApplicationRunner接口类似于CommandLineRunner,但提供了更灵活的参数处理方式

import org.springframework.boot.ApplicationArguments;  
import org.springframework.boot.ApplicationRunner;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CacheApplicationRunner implements ApplicationRunner {  
  
    @Autowired  
    private YourRepository yourRepository;  
  
    @Autowired  
    private CacheManager cacheManager;  
  
    @Override  
    public void run(ApplicationArguments args) throws Exception {  
        // 从数据库中获取数据并加载到缓存中  
        List<YourData> dataList = yourRepository.findAll();  
        dataList.forEach(data -> {  
            cacheManager.getCache("yourCacheName").put(data.getId(), data);  
        });  
    }  
}

使用@EventListener注解监听ApplicationReadyEvent事件

Spring Boot在启动完成后会发布一个ApplicationReadyEvent事件,你可以监听这个事件并在事件触发时执行加载数据的逻辑。

import org.springframework.boot.context.event.ApplicationReadyEvent;  
import org.springframework.context.event.EventListener;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CacheInitializer {  
  
    @Autowired  
    private YourRepository yourRepository;  
  
    @Autowired  
    private CacheManager cacheManager;  
  
    @EventListener(ApplicationReadyEvent.class)  
    public void onApplicationReadyEvent() {  
        // 从数据库中获取数据并加载到缓存中  
        List<YourData> dataList = yourRepository.findAll();  
        dataList.forEach(data -> {  
            cacheManager.getCache("yourCacheName").put(data.getId(), data);  
        });  
    }  
}

需要注意的是,加载数据的操作应该尽可能快地完成,避免延迟应用的启动时间。如果加载数据量非常大,你可能需要考虑异步加载或延迟加载的策略。


相关文章
|
7月前
|
前端开发 JavaScript Java
Springboot 使用thymeleaf 服务器无法加载resources中的静态资源异常处理
Springboot 使用thymeleaf 服务器无法加载resources中的静态资源异常处理
547 0
|
Java Spring
【面试题精讲】说一说springboot加载配置文件优先级
【面试题精讲】说一说springboot加载配置文件优先级
|
27天前
|
监控 IDE Java
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
46 8
|
2月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
|
3月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
102 0
|
4月前
|
Java Spring
Spring boot +Thymeleaf 本地图片加载失败(图片路径)的问题及解决方法
这篇文章详细讲解了在Spring Boot应用程序中本地图片无法加载的问题原因,并提供了两个示例来说明如何通过使用正确的相对路径或Thymeleaf语法来解决图片路径问题。
|
4月前
|
前端开发 JavaScript Java
Spring boot 本地图片不能加载(图片路径)的问题及解决方法
这篇文章讨论了Spring Boot应用程序中本地图片无法加载的问题,通常由图片路径不正确引起,并提供了使用正确的相对路径和Thymeleaf语法来解决这一问题的两种方法。
|
4月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
49 0
|
5月前
|
IDE Java Maven
【项目问题解决】SpringBoot错误: 找不到或无法加载主类
SpringBoot应用启动时若出现“找不到或无法加载主类”错误,常见原因包括配置问题、编译问题或IDE设置不当。解决方法包括:检查`application.properties`配置,执行`maven clean install`,删除`.idea`文件后重导入IDEA,确保启动类路径正确,清理并重新编译项目,检查项目配置、依赖项及IDEA配置。参考CSDN和知乎相关文章。
2278 0