前言

在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载、初始化缓存、特定任务的注册等等。我找到了三种方式解决下面的问题。

1、使用PostConstruct注解

  这种解决方法比较适用于: 在对于接口响应时间要求比较短,而接口中又需要频繁调用数据库查询,或者调用外部系统的情况下,为了加快接口的响应速度,在项目启动时,将通过途径获取的结果初始化到静态变量或者放置到各种缓存中。

首先静态代码块不行,静态代码块的执行顺序在Spring注解之前,当执行的时候,调用请求的Service还没有注入进来,执行时会报空指针错误。

在启动时完成一些初始化的操作,而这些初始化的操作,又要依赖于依赖注入的结果,就无法在构造方法中实现了。为此需要使用@PostConstruct,在构造方法之后执行,被@PostConstruct注解的方法会依赖完成后被自动调用。

关于Constructor,Spring注解,@PostConstruct执行顺序:Constructor >Spring注解> @PostConstruct

@Component
public class TestUtils { @Autowired
ICommonService commonService; public static List<Rsp> resourceList = new ArrayList<>(); //初始化的全局静态变量
private static ICommonService reCommonService; @PostConstruct
public void Init() {
//查询所有的
Req reqBean = new Req();
reCommonService=commonService;
     reqBean.setFindType(PROVINCE_CITY_FIND_TYPE.FIND_TYPE_B.toString());//查询所有 城市
Rsp rsp=reCommonService.getPaAreaCityInfo(reqBean);
resourceList.add(rsp);
}
}

2、使用ApplicationListener

  

在初始化缓存或者特定任务的注册的场景下,可以使用Spring提供的ApplicationListener来进行操作。

首先,要实现ApplicationListener接口并实现onApplicationEvent方法。举例(使用SpringBoot)如下:

public class ApplicationEventListener implements ApplicationListener<ApplicationEvent> {
@Autowired
private PubSubService pubSubService; @Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
ApplicationContext applicationContext = ((ContextRefreshedEvent) event).getApplicationContext();
GlobolParameters.context = applicationContext;
BaseLogger.info("ContextRefreshed初始化开始...");
// 设置上下文
}
if (event instanceof ApplicationReadyEvent) {
//启动发布订阅
pubSubService = GlobolParameters.context.getBean(PubSubService.class);
// redis subscribe job
pubSubService.subscribe();
// redis publish job
pubSubService.publish();
}
if (event instanceof ApplicationFailedEvent) {
Throwable exception = ((ApplicationFailedEvent) event).getException();
BaseLogger.error("【ApplicationFailedEvent】Spring IOC init error ", exception);
}
}
}

  然后实例化ApplicationEventListener类,在Spring Boot中通过一个配置类进行实例化:

@Configuration
public class ListenerConfig {
@Bean
public ApplicationEventListener applicationEventListener(){
return new ApplicationEventListener();
}
}

  通过上述代码,在SpringListener中做到,启动了发布订阅的服务。

3、启动类显式调用

  如果对外调用的服务,需要依赖启动后放置在容器中的上下文的情况,则需要手动在启动类中获取相应的Bean,调用初始化的方法进行初始化。

public class StartIiApplication{
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(StartIiApplication.class, args);
BeanUtil.setApplicationContext(applicationContext);
//从启动的容器中获取Bean,并调用初始化方法
TestUtils util=(TestUtils) applicationContext.getBean("testUtils");
util.Init(); }
}

Spring 启动加载资源到内存的更多相关文章

  1. spring启动加载过程源码分析

    我们知道启动spring容器两常见的两种方式(其实都是加载spring容器的xml配置文件时启动的): 1.在应用程序下加载 ApplicationContext ctx = new ClassPat ...

  2. as3 Loader 加载资源后内存泄露无法释放的问题。

    本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加载bitmapdata之后,自己dispose,要么就是加 ...

  3. 解析spring启动加载dubbo过程

    一:简单配置 web.xml <context-param> <param-name>contextConfigLocation</param-name> < ...

  4. tomcat启动加载web项目内存溢出

    通过tomcat命令启动tomcat的web项目时,根据项目大小,有可能会报以下两个错误. 在启动时没有错误,但是在访问时会报错: 1. java.lang.OutOfMemoryError: Jav ...

  5. spring启动加载类,手动加载bean

    方法一: public final class Assembler implements BeanFactoryPostProcessor { private static ConfigurableL ...

  6. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  7. Spring 启动时加载资源

    Spring加载资源文件目前了解三种, @PostConstruct在Context加载完成之后加载.在创建各个Bean对象之前加载. 实现ApplicationRunner的run方法,Bean加载 ...

  8. Spring boot 国际化自动加载资源文件问题

    Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义 ...

  9. spring加载资源文件中classpath*与classpath的区别

    在spring和MyBatis继承的时候,配置mapperLocations.一开始配置是这样的. 需要加载路径为com/thomas/base/mapper和com/thomas/bu/mapper ...

随机推荐

  1. Luogu2791 幼儿园篮球题【斯特林数,数学】

    题目链接:洛谷 我一开始不知道$N,M$有什么用处,懵逼了一会儿,结果才发现是输入数据范围... $$\begin{aligned}\binom{n}{k}Ans&=\sum_{i=0}^k\ ...

  2. 【原创】go语言学习(二十)并发编程

    目录 并发和并行 Goroutine初探 Goroutine实战 Goroutine原理浅析 Channel介绍 Waitgroup介绍 Workerpool的实现 并发和并行 1.概念A. 并发:同 ...

  3. Java基础系列 - try...catch...finally

    package com.test6; import java.io.FileReader; import java.io.IOException; /** * try...catch...finall ...

  4. mysql插入数据自动生成主键uuid

    DemoMapper.java //注意方法的返回值必须是void; void add(Demo demo); ============================================ ...

  5. BZOJ1211树的计数

    裸的prufer结论. 给个小链接prufer序列 ,里面有一个性质4就是本题答案,严谨证明可以上网找一找,如果从多组组合角度理解也可以. 剩下的就是特判,n==1时,du==0,1个,du!=0,废 ...

  6. 命令行启动模块的Python代码研究

    pyrasite的 __requires__ = 'pyrasite==2.0' import re import sys from pkg_resources import load_entry_p ...

  7. linuxfind命令按照文件大小搜索的注意事项

    [root@localhost ~]# man find -size n[cwbkMG] File uses n units of space. The following suffixes can ...

  8. 【Python】分析自己的博客 https://www.cnblogs.com/xiandedanteng/p/?page=XX,看每个月发帖量是多少

    要执行下面程序,需要安装Beautiful Soup和requests,具体安装方法请见:https://www.cnblogs.com/xiandedanteng/p/8668492.html # ...

  9. body-parser 解析post数据

    安装 $ npm install body-parser API var bodyPaeser =require('body-parser') bodyParse.raw(option) 将请求体内容 ...

  10. hwclock和date源码分析

    一. hwclock 1.1 hwclock源码在哪里? util-linux 或者busybox 1.2 获取源码 git clone https://github.com/karelzak/uti ...