一  业务背景

监听应用容器启动完毕并扫描容器类特定的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容器初始化完成后执行业务逻辑的三种方式相关推荐

  1. 当Spring 容器初始化完成后执行某个方法

    当Spring 容器初始化完成后执行某个方法 实现ApplicationListener 使用注解:`@PostConstruct` 实现ApplicationListener 在做web项目开发中, ...

  2. 执行 Python 程序的三种方式及Python 的 IDE —— `PyCharm`

    执行 Python 程序的三种方式 3.1. 解释器 python / python3 Python 的解释器 # 使用 python 2.x 解释器 $ python xxx.py# 使用 pyth ...

  3. perl mysql dml_MySQL Connector执行SQL语句的三种方式

    描述 当我们需要在Java程序中与数据库进行交互,可能首先想到的是使用某个ORM框架,因为ORM框架封装了一些实现细节,在使用上非常方便,并且一定程度上可以提升代码稳定性. 在ORM框架中,都会依赖M ...

  4. 3. mysql的注解驱动的三种方式_上手spring boot项目(三)之spring boot整合mybatis进行增删改查的三种方式。...

    1.引入依赖 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot- ...

  5. Python 执行Python程序的三种方式

    解释器 python / python3 python 的解释器 # 使用python 2.x 解释器 python xxx.py# 使用python 3.x 解释器 python3 xxx.py P ...

  6. linux系列(七):shell编程、shell概念、ssh协议概念、执行shell文件的三种方式

    1 概念 https://www.xshell.com/zh/free-for-home-school/ 1.1 xshell(执行linux命令的客户端软件) Xshell [1] 是一个强大的安全 ...

  7. spring boot 生成初始和销毁对象方法的三种方式

    配置文件 //注解类 @Configuration public class Config { //初始化提示和销毁提示 one :通过实现接口方法 @Beanpublic Cat createCat ...

  8. spring bean实现init/destory生命周期方法的三种方式

    实现InitializingBean和DisposableBean接口,实现afterPropertiesSet()和destroy()方法 使用@PostConstruct和@PreDestroy进 ...

  9. 如何在SpringWEB项目或者Springboot启动时直接执行业务代码(三种方式)

    我的博客原文链接 前言 通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况.比如将数据库中的配置信息或者数据字典之类的缓存到redis,或者在服务启动的时候将一些配置化 ...

最新文章

  1. 深入理解 Neutron -- OpenStack 网络实现(2):VLAN 模式
  2. python爬虫Scrapy框架之增量式爬虫
  3. 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议
  4. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
  5. 第十四篇 元类编程(二)
  6. mysql se_常见的MySQL命令
  7. django连接mysql
  8. linux+极点五笔输入法,Linux技巧之Ubuntu11.04下安装极点五笔输入法
  9. 【网络】把路由器用作交换机的方案
  10. 关于微信小程序授权登陆之后需要在个人信息页展示信息,如微信头像,昵称这件事
  11. java拷贝远程服务器上文件,java拷贝远程服务器上文件
  12. 范型 DAO范型的应用
  13. JavaSE 和 Java EE 分别是什么
  14. (python爬虫时)如何知道是否代理ip伪装成功
  15. 拥抱POL正当时,这里有四个故事五个理由
  16. Linux·VFS虚拟文件系统
  17. 使用 Redux 和 Axios 获取数据
  18. java语言下列说法正确的是_中国大学MOOC: 以下关于Java语言说法正确的是( )。...
  19. Java-基于百度API的图片文字识别(支持中文,英文和中英文混合)
  20. 前端笔记(DHTML)

热门文章

  1. python读写excel表操作
  2. 交换机与路由器和电脑的连接
  3. bootstrap之按钮大小+图片大小调整
  4. 4-p04_guess_name
  5. API_QQ头像获取接口,腾讯QQ头像获取直链
  6. 使新版Edge支持iCloud同步
  7. LabVIEW VDM2019 与 OpenVINO 的路径冲突
  8. 小学五年级计算机试题,小学五年级语文下册期中试卷2015(附答案)
  9. gorm中created_at 时间,go time时间,mysql数据库时间的一些问题总结
  10. 网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案