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

庞国明博客 庞国明博客     2022-10-04     533

关键词:

在做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("初始化完毕!");
        }
    }
复制代码

spring实战spring容器初始化完成后执行初始化数据方法(代码片段)

...c;经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等等。而项目采用了Spring依赖注入来管理... 查看详情

spring实战spring容器初始化完成后执行初始化数据方法(代码片段)

...c;经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等等。而项目采用了Spring依赖注入来管理... 查看详情

spring再tomcat启动后,初始化完成后,自动执行一次某个类,怎么做

spring再tomcat启动后,初始化完成后,自动执行一次某个类,怎么做这个类使用了spring的注入,所以要求这个类是受spring管理的容器启动后,spring加载完毕,然后自动运行一下这个类,怎么做?明白你的意思了,在tomcat启动完成后,spr... 查看详情

springboot框架在容器加载完成之后执行某个方法(代码片段)

问题描述:想在websocket实现的Handler中执行一些初始化操作,但是初始化操作使用到了@Autowired自动注入的变量,而且是保护类型。第一个想法是放到Handler构造函数中执行,但是@Autowired注入的变量为null,故此方法不可行。问题解... 查看详情

spring启动容器加载成功后执行调用方法(代码片段)

...再去请求接口.所以我的想法是每次启动项目的时候,容器初始化完成,就去调用一下基础服务的接口.通过一个本地map来缓存需要的数据.当我需要使用的时候直接从本地缓存中取.下面是具体的代码实现.在启动类中实现ApplicationListen... 查看详情

想springboot启动完成后执行某个方法

...fresh方法afterRefresh会触发callRunners方法callRunners方法会调用容器里面所有实现了ApplicationRunner、CommandLineRunner接口的方法 查看详情

spring——管理bean的生命周期

我们可以自定义bean的初始化和销毁方法,这里所指的的初始化和bean的构造不同,初始化是在bean构造完成后,对bean内部的属性或一些逻辑进行初始化。首先要弄清一些概念:构造(对象创建)    单实例:在容器启动时创... 查看详情

springboot启动后执行某个方法

参考技术A在项目中,SpringBoot启动后,需要初始化一些业务,要在服务启动后自动执行,不用人去手动操作,即把一些业务放到某方法中,服务启动后可自动执行。总结了3种方法:用起来和第一种差不多PostConstruct是Java提供的注... 查看详情

springioc容器实现

...g的两种IoC容器BeanFactory 基础类型的IoC容器;采用延迟初始化策略(容器初始化完成后并不会创建bean的对象,只有当收到初始化请求时才进行初始化);由于延迟初始化,因此启动速度较快,占用资源较少;ApplicationContext ... 查看详情

spring容器加载完毕做一件事情(利用contextrefreshedevent事件)

...情时发现包空指针错误,这是因为我们这个类有可能已经初始化完成,但是引用的其他类不一定初始化完成,所以发生了空指针错误,解决方案如下: 查看详情

spring注解-生命周期属性赋值自动装配

一、Bean的生命周期流程Bean创建——初始化——销毁创建:单实例:在容器启动时创建对象多实例:每次调用时创建对象初始化:都是在对象创建完成后,调用初始化方法销毁:单实例:容器关闭时,调用销毁方法多实例:容器... 查看详情

spring源码分析ioc容器初始化——查漏补缺(代码片段)

...化过程:分析:bean实例化开始后注入对象属性后(前面IOC初始化十几篇文章)。检查激活Aware接口。执行BeanPostProcessor前置处理实例化bean,这里会检查InitializingBean和init-method方法。执行BeanPostProcessor后置处理注册销毁be 查看详情

spring之bean的生命周期

...实例;为bean的属性设置值并对其他bean的引用;调用Bean的初始化方法;bean可以被使用了;当容器关闭时,调用bean的销毁方法;(3)当bean设置声明了init-method 查看详情

在java中怎么能让tomcat启动完后,spring配置文件加载完后自动运行某个类?

...性注掉。spring配置在listener节点中,在容器启动时会首先初始化spring,其次是filter,最后才是servlet(配置了start-up的情况下),如果你的那个类是放在listener中的,那么要在spring启动完后再启动它,就要把它配置到spring之后。追问你... 查看详情

spring事务提交回滚源码解析(代码片段)

前言在上篇文章 Spring事务初始化源码分析  中分析了Spring事务初始化的一个过程,当初始化完成后,Spring是如何去获取事务,当目标方法异常后,又是如何进行回滚的,又或是目标方法执行成功后,又是... 查看详情

spring事务提交回滚源码解析(代码片段)

前言在上篇文章 Spring事务初始化源码分析  中分析了Spring事务初始化的一个过程,当初始化完成后,Spring是如何去获取事务,当目标方法异常后,又是如何进行回滚的,又或是目标方法执行成功后,又是... 查看详情

js加alert后才能执行方法

原因是:访问页面时,某些js方法还没初始化(或者还没有加载出来)此时调用肯定不执行。alert起到了延迟的功能,当用户点击确定此时要执行的js恰好初始化完成,能正常执行。解决方法是加setTimeout函数,延迟1秒执行js。 ... 查看详情

vue-生命周期

...阶段:创建、运行、销毁创建阶段:由空白期、data/methods初始化、模板挂载、模板渲染等组成;运行阶段:分为更新前和更新后两部分;销毁阶段:分为销毁前和销毁后;成员方法:创建:beforeCreatecreatedbeforeMountmounted;运行:be... 查看详情