Spring容器初始化完成后执行业务逻辑的三种方式
一 业务背景
监听应用容器启动完毕并扫描容器类特定的Dubbo服务,并把相关元数据注册到网关。
二 思路
1 在容器启动构造元数据上报到网关,影响应用启动性能;
2 监听容器启动完毕后构造元数据上报到网关,无性能影响;
三 监听应用启动完毕的三种方式
方法一、
package com.leadsoft.test.executor.processorpublic class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。}
}
同时在Spring的配置文件中,添加注入:
<!-- 当Spring容器启动完成后执行下面的这个Bean -->
<bean class = "com.leadsoft.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) {//root application context 没有parent,他就是老大.if (event.getApplicationContext().getParent() == null ){//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。}
}
方法二、
其实更简单的方法是使用注解:`@PostConstruct`,
只需要在需要启动的时候执行的方法上标注这个注解就搞定了。
方法三、
方法实现InitializingBean或者ServletContextAware
Spring容器初始化完成后执行业务逻辑的三种方式相关推荐
- 当Spring 容器初始化完成后执行某个方法
当Spring 容器初始化完成后执行某个方法 实现ApplicationListener 使用注解:`@PostConstruct` 实现ApplicationListener 在做web项目开发中, ...
- 执行 Python 程序的三种方式及Python 的 IDE —— `PyCharm`
执行 Python 程序的三种方式 3.1. 解释器 python / python3 Python 的解释器 # 使用 python 2.x 解释器 $ python xxx.py# 使用 pyth ...
- perl mysql dml_MySQL Connector执行SQL语句的三种方式
描述 当我们需要在Java程序中与数据库进行交互,可能首先想到的是使用某个ORM框架,因为ORM框架封装了一些实现细节,在使用上非常方便,并且一定程度上可以提升代码稳定性. 在ORM框架中,都会依赖M ...
- 3. mysql的注解驱动的三种方式_上手spring boot项目(三)之spring boot整合mybatis进行增删改查的三种方式。...
1.引入依赖 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot- ...
- Python 执行Python程序的三种方式
解释器 python / python3 python 的解释器 # 使用python 2.x 解释器 python xxx.py# 使用python 3.x 解释器 python3 xxx.py P ...
- linux系列(七):shell编程、shell概念、ssh协议概念、执行shell文件的三种方式
1 概念 https://www.xshell.com/zh/free-for-home-school/ 1.1 xshell(执行linux命令的客户端软件) Xshell [1] 是一个强大的安全 ...
- spring boot 生成初始和销毁对象方法的三种方式
配置文件 //注解类 @Configuration public class Config { //初始化提示和销毁提示 one :通过实现接口方法 @Beanpublic Cat createCat ...
- spring bean实现init/destory生命周期方法的三种方式
实现InitializingBean和DisposableBean接口,实现afterPropertiesSet()和destroy()方法 使用@PostConstruct和@PreDestroy进 ...
- 如何在SpringWEB项目或者Springboot启动时直接执行业务代码(三种方式)
我的博客原文链接 前言 通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况.比如将数据库中的配置信息或者数据字典之类的缓存到redis,或者在服务启动的时候将一些配置化 ...
最新文章
- 深入理解 Neutron -- OpenStack 网络实现(2):VLAN 模式
- python爬虫Scrapy框架之增量式爬虫
- 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议
- oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
- 第十四篇 元类编程(二)
- mysql se_常见的MySQL命令
- django连接mysql
- linux+极点五笔输入法,Linux技巧之Ubuntu11.04下安装极点五笔输入法
- 【网络】把路由器用作交换机的方案
- 关于微信小程序授权登陆之后需要在个人信息页展示信息,如微信头像,昵称这件事
- java拷贝远程服务器上文件,java拷贝远程服务器上文件
- 范型 DAO范型的应用
- JavaSE 和 Java EE 分别是什么
- (python爬虫时)如何知道是否代理ip伪装成功
- 拥抱POL正当时,这里有四个故事五个理由
- Linux·VFS虚拟文件系统
- 使用 Redux 和 Axios 获取数据
- java语言下列说法正确的是_中国大学MOOC: 以下关于Java语言说法正确的是( )。...
- Java-基于百度API的图片文字识别(支持中文,英文和中英文混合)
- 前端笔记(DHTML)