当spring 容器初始化完成后执行某个方法

在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查。

比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数。

而在Spring的web项目中,我们可以介入Spring的启动过程。我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,这个时候我们就可以实现一个接口:

package com.yk.test.executor.processor
public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
}
}

同时在Spring的配置文件中,添加注入:

<!-- 当Spring容器启动完成后执行下面的这个Bean -->
<bean class="com.yk.test.executor.processor.InstantiationTracingBeanPostProcessor"/>

但是这个时候,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。

这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理,修改后代码

如下:

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() == null){//root application context 没有parent,他就是老大.
//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
}
}

其实更简单的方法是使用注解:`@PostConstruct`,只需要在需要启动的时候执行的方法上标注这个注解就搞定了。

例子:

    /**
     * 服务启动时就执行--添加超级管理员
     */
    @PostConstruct
    public void addDefaultAdmin() {
        try {
            User user = new User();
            user.setCreateTime(new Date());
            try {
                user.setPassword(Md5.md5Encode("admin"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            user.setUserName("admin");
            user.setRole(FrameConstant.USER_SUPER_ADMIN);
            userDao.save(user);
            log.debug("初始化完毕!");
        } catch (Exception e) {
            log.debug("初始化完毕!");
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python自动化测试

Django路由系统学习(四)

在Django的执行原理中已经学习了django的执行过程,本小节重点来介绍django的路由系统,也就是url的部分,在前面的Django的执行原理中...

852
来自专栏纯洁的微笑

springboot(十八):使用Spring Boot集成FastDFS

上篇文章介绍了《如何使用Spring Boot上传文件》,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中。 这个项目会...

3664
来自专栏LIN_ZONE

thinkphp 在本地正常,在云端ubuntu下报控制器不存在

thinkphp的控制器的文件夹默认是小写字母,如果你不经意间把它的第一个字母改为大写,ubuntu下的服务器在运行该框架时,就会出现找不到控制器,所以,如果出...

733
来自专栏james大数据架构

高可用高性能分布式文件系统FastDFS实践Java程序

  在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构...

4708
来自专栏企鹅号快讯

渗透技巧——”隐藏”注册表的创建

0x00 前言 知名恶意软件Poweliks曾使用过的一个后门技术,在注册表启动位置创建一个特殊的注册表键值,通过mshta来执行payload 对于这个特殊的...

1908
来自专栏从零开始学自动化测试

selenium+python自动化97--unittest参数化(paramunittest)

前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 前面讲数据驱动的时候,用ddt可以解决多组数据...

3706
来自专栏编程一生

漫画:Linux中/etc/resolv.conf文件和puppet工具解析

1156
来自专栏信安之路

PHP 文件包含漏洞姿势总结

文件包含漏洞的产生原因是在通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注...

1100
来自专栏伦少的博客

Spark读取压缩文件

73910
来自专栏从零开始学自动化测试

pytest文档15-使用自定义标记mark

pytest可以支持自定义标记,自定义标记可以把一个web项目划分多个模块,然后指定模块名称执行。app自动化的时候,如果想android和ios公用一套代码时...

442

扫码关注云+社区