欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法

 更新時(shí)間:2023年02月16日 08:58:33   作者:阿文_ing  
這篇文章主要介紹了spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring容器加載完成后再執(zhí)行自己的方法

在開(kāi)發(fā)過(guò)程中遇到了要在項(xiàng)目啟動(dòng)后自動(dòng)開(kāi)啟某個(gè)服務(wù),由于使用了spring,我在使用了spring的 listener ,它有 onApplicationEvent ()方法, 在Spring容器將所有的Bean都初始化完成之后,就會(huì)執(zhí)行該方法 。

應(yīng)用場(chǎng)景

很多時(shí)候我們想要在某個(gè)類加載完畢時(shí)干某件事情,但是使用了spring管理對(duì)象,我們這個(gè)類引用了其他類(可能是更復(fù)雜的關(guān)聯(lián)),所以當(dāng)我們?nèi)ナ褂眠@個(gè)類做事情時(shí)發(fā)現(xiàn)包空指針錯(cuò)誤,這是因?yàn)槲覀冞@個(gè)類有可能已經(jīng)初始化完成,但是引用的其他類不一定初始化完成,所以發(fā)生了空指針錯(cuò)誤

解決方案如下    

1.寫一個(gè)類繼承spring的ApplicationListener監(jiān)聽(tīng),并監(jiān)控ContextRefreshedEvent事件(容易初始化完成事件)    

2.定義簡(jiǎn)單的bean:<bean id="startListener" class="com.itsm.core.service.table.StartListener"></bean> 或者直接使用@Service注解方式

@Service
public class StartListener implements ApplicationListener<ContextRefreshedEvent> {
? ? public static final Map<Integer, TableMapper> mappers = new HashMap<>();
? ? @Resource
? ? A_Mapper a_mapper;
? ? @Override
? ? public void onApplicationEvent(ContextRefreshedEvent event)
? ? {
? ? ? ? if(event.getApplicationContext().getParent() == null)//root application context 沒(méi)有parent,他就是老大.
? ? ? ? {
? ? ? ? ? ? //需要執(zhí)行的邏輯代碼,當(dāng)spring容器初始化完成后就會(huì)執(zhí)行該方法。
? ? ? ? ? ? System.out.println("\n\n\n\n\n______________\n\n\n加載了\n\n_________\n\n");
? ? ? ? }
? ? ? ? //或者下面這種方式
? ? ? ? if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext"))
? ? ? ? {
? ? ? ? ? ? System.out.println("\n\n\n_________\n\n加載一次的 \n\n ________\n\n\n\n");
? ? ? ? }
? ? ? ? mappers.put(1,a_mapper);
? ? }
}

spring容器加載完成之后進(jìn)行開(kāi)啟一個(gè)線程進(jìn)行數(shù)據(jù)更新操作

需求:最近做項(xiàng)目遇到了一個(gè)需求,數(shù)據(jù)表中有些數(shù)據(jù)需要定時(shí)更新,這樣就需要啟動(dòng)一個(gè)線程完成,不想再新建一個(gè)項(xiàng)目來(lái)完成這些事,就想在spring啟動(dòng)之后來(lái)開(kāi)啟一個(gè)線程定時(shí)來(lái)完成這件事 ,直接上代碼

package com.irisian.picturelabel.listener;

import com.irisian.picturelabel.service.PictureService;
import com.irisian.picturelabel.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
?* Author:吳滿心
?* Date:2018/5/18
?* Function:負(fù)責(zé)在spring容器加載完成之后進(jìn)行圖片和任務(wù)數(shù)據(jù)表的更新
?*/
@Component
public class SpringFinishedListener implements InitializingBean {
? ? private static final Logger logger = LoggerFactory.getLogger(SpringFinishedListener.class);

? ? @Autowired
? ? private PictureService pictureService;

? ? @Autowired
? ? private TaskService taskService;

? ? @Override
? ? public void afterPropertiesSet() throws Exception {
? ? ? ? new Thread(() -> {
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? logger.info("開(kāi)始執(zhí)行圖片和任務(wù)的更新操作!");
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? pictureService.updatePictureStatus();
? ? ? ? ? ? ? ? ? ? //更新任務(wù)的完成狀態(tài)信息
? ? ? ? ? ? ? ? ? ? taskService.updateFinishStatus();
? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? logger.error(e.getMessage());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Thread.sleep(1800000); ? ? ?//30分鐘執(zhí)行一次進(jìn)行數(shù)據(jù)更新
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? logger.error(e.getMessage());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }).start();


? ? }
}

開(kāi)始還嘗試過(guò)servlet的方法,如

package com.irisian.picturelabel.servlet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

/**
?* Author:吳滿心
?* Date:2018/5/18
?* Function:
?*/
@WebServlet(name = "backServlet", urlPatterns = {"/backServlet"})
public class BackServlet extends HttpServlet {
? ? private static final Logger logger= LoggerFactory.getLogger(BackServlet.class);

? ? @Override
? ? public void init() throws ServletException {
? ? ? ? new Thread(()->{
? ? ? ? ? ? while(true){
? ? ? ? ? ? ? ? logger.info("我5秒鐘執(zhí)行一次");
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Thread.sleep(5000);
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? logger.error(e.getMessage());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }).start();
? ? }


? ? @Override
? ? public void destroy() {
? ? ? ? logger.info("服務(wù)器關(guān)閉了");
? ? }
}

配置Configuration

package com.irisian.picturelabel.configuration;
import com.irisian.picturelabel.exception.MyExceptionResolver;
import com.irisian.picturelabel.servlet.BackServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;

/**
?* Author:吳滿心
?* Date:2018/5/15
?* Function:
?*/
@Configuration
public class SpringConfiguration {
? ? @Bean
? ? public HandlerExceptionResolver getHandlerExceptionResolver() {
? ? ? ? return new MyExceptionResolver();
? ? }

? ? /**
? ? ?* 配置一個(gè)后臺(tái)運(yùn)行的servlet
? ? ?* @return
? ? ?*/
? ? @Bean
? ? public ServletRegistrationBean servletRegistrationBean() {
? ? ? ? ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new BackServlet(), "/backServlet");
? ? ? ? servletRegistrationBean.setLoadOnStartup(1); ? ? ? ?//數(shù)字越小,啟動(dòng)優(yōu)先級(jí)越高,但是必須大于0
? ? ? ? return servletRegistrationBean;
? ? }

}

但是不滿足spring啟動(dòng)之后,spring不啟動(dòng)完成,就無(wú)法使用bean了,所以就按照前面的一種方法了

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

  • MyBatisPlus3.x中使用代碼生成器(全注釋)

    MyBatisPlus3.x中使用代碼生成器(全注釋)

    這篇文章主要介紹了MyBatisPlus3.x中使用代碼生成器(全注釋),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Hadoop源碼分析三啟動(dòng)及腳本剖析

    Hadoop源碼分析三啟動(dòng)及腳本剖析

    本篇是Hadoop源碼分析系列文章第三篇,主要介紹Hadoop啟動(dòng)以及腳本的剖析,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • java實(shí)習(xí)--每天打卡十道面試題!

    java實(shí)習(xí)--每天打卡十道面試題!

    臨近秋招,備戰(zhàn)暑期實(shí)習(xí),祝大家每天進(jìn)步億點(diǎn)點(diǎn)!本篇文章準(zhǔn)備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進(jìn)入自己心儀的大廠
    2021-07-07
  • java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)詳解

    java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)詳解

    在本文里小編給大家分享了關(guān)于java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)以及實(shí)例代碼內(nèi)容,需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • java關(guān)于持久層面試題目整理

    java關(guān)于持久層面試題目整理

    在本篇文章里小編給大家分享的是一篇關(guān)于java關(guān)于持久層面試題目整理內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    這篇文章主要介紹了Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解,當(dāng)在?web.xml?注冊(cè)了一個(gè)?Filter?來(lái)對(duì)某個(gè)?Servlet?程序進(jìn)行攔截處理時(shí),它可以決定是否將請(qǐng)求繼續(xù)傳遞給?Servlet?程序,以及對(duì)請(qǐng)求和響應(yīng)消息是否進(jìn)行修改,需要的朋友可以參考下
    2023-08-08
  • JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼

    JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼

    在java平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色主要三種角色:調(diào)用者、取貨憑證、真實(shí)數(shù)據(jù)。本篇文章給大家介紹java實(shí)現(xiàn)異步調(diào)用實(shí)例代碼,需要的朋友可以參考下
    2015-09-09
  • java FastJson的簡(jiǎn)單用法

    java FastJson的簡(jiǎn)單用法

    FastJson是阿里的開(kāi)源JSON解析庫(kù),可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean,這里我介紹一下FastJson的使用,感興趣的朋友一起看看吧
    2021-09-09
  • 詳談Java8新特性泛型的類型推導(dǎo)

    詳談Java8新特性泛型的類型推導(dǎo)

    這篇文章我們來(lái)看一篇關(guān)于Java8新特性之泛型的類型推導(dǎo),希望這篇文章能夠讓各位深入到了解到關(guān)于Java8新特性之泛型的類型用法,有需要的朋友們下面來(lái)一起看看吧。
    2016-09-09
  • 最新評(píng)論