文档章节

如何优雅的在Spring容器启动完成后进行资源初始化

傲娇字符
 傲娇字符
发布于 2018/05/05 10:12
字数 464
阅读 185
收藏 2

问题描述:

经常遇到这样的场景:希望容器启动的时候,进行一些初始化等操作。一般的做法就是通过Spring的bean set方式或者@PostConstruct注解来解决;

很多人使用@ PostConstruct或者@Component的时候,经常出现Spring容器里面的bean(尤其是数据库操作相关的bean)还没有启动完全,自己需要初始化的bean代码已经调用。

下面是一个自己使用的方法,也许不是最优的方案,但是是经过了实践考验的。

编写所有启动类的接口

这一步可以省略,因为我要实现的是,容器启动的时候,自动扫描所有实现了自定义启动接口的实例,并调用初始化方法。

package com.chz.apps.common.component;

/**
 * 自启动接口类,容器启动完成后,自动调用启动方法
 */
public interface IAutoStartPlugin {

    /**
     * 启动
     */
    void start();

}

编写容器启动bean

package com.chz.component.basic.listener;

import com.chz.apps.common.component.IAutoStartPlugin;
import com.chz.component.basic.configure.SpringContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {

    private static Boolean loaded = false;//启动标记,确保只启动过一次

    @Autowired
    private DicPlugin dicPlugin;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if(event.getApplicationContext().getParent() != null && !loaded){
            Map<String,IAutoStartPlugin> allPlugin = SpringContextHolder.getApplicationContext().getBeansOfType(IAutoStartPlugin.class);
            if(allPlugin != null || allPlugin.size() > 0){
                for (Map.Entry<String,IAutoStartPlugin> row : allPlugin.entrySet()) {
                    row.getValue().start();//调用启动类
                }
            }
            loaded = true;
        }
    }

}

添加ApplicationContext.xml配置

在文件的最后加上如下配置:

<bean id="afterStartupListener" class="com.chz.component.basic.listener.StartupListener" /><!-- 启动容器后执行的方法 -->

编写接口实现类即可

剩下的工作就与业务有关了,直接编写接口实现类,程序在启动的时候,加载完Spring容器后,会调用上面的StartupListener类进行初始化,通过SpringContextHolder(需要预先配置)获取所有实现了接口的bean,依次调用bean里面的start方法。

© 著作权归作者所有

共有 人打赏支持
傲娇字符
粉丝 6
博文 43
码字总数 17111
作品 0
武汉
架构师
私信 提问
Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源

在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启...

纯洁的微笑
2018/05/03
0
0
使用Maven构建dubbo服务可执行的jar包

1.使用Servlet 容器运行 ---不可取 缺点:增加复杂性 浪费资源 原因: tomcat 运行需要端口, 一个tomcat 跑多个服务,也需要配置端口,是一个问题, 增加管理的复杂性, 本身要多Servlet容器...

哲别0
2017/10/31
0
0
深入理解Spring源码(一)-IOC容器的定位,载入,注册

前言:Spring源码继承,嵌套层次非常多,读起来非常容易晕,小伙伴们在看文章的时候一定要跟着文章的思路自己去源码里点一点,看一看,并且多看几次。就会越来越清晰。下面开始正题 1.Spring...

Meet相识_bfa5
2018/05/01
0
0
给你一份Spring Boot知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spring Boot应用本质上就是一个基于Spring框架的应用...

java知识分子
2018/09/12
0
0
给你一份超详细Spring Boot知识清单

因而 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring 对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于 Spring 生态圈的应用。 那 Spri...

51CTO技术栈
2018/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
35分钟前
0
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
5
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
7
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
3
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部