背景介绍:

服务端期望使用 面向对象编程, 和 spring 结合的话只能是通过 prototype 的 bean 定义,并通过 getBean 获取.

优雅停机探究:

代码说明:

1. 类关系 SimpleSpringTest PrototypeScopeBean

    2. 执行流程: SimpleSpringTest内的方法通过getBean 获取prototype的 bean. 内有有线程池执行相关逻辑.

3. 两个类对实现了 spring 的关闭事件通知

4. 先上层SimpleSpringTest关闭连接,然后内部PrototypeScopeBean关闭线程shutdown.保证所有线程都执行完才退出. [ 否则由于内存无持久化,导致相关数据和流程丢失.分布式问题. 最好通过 mq 发送. ]

操作流程:

1. 启动代码

2.关闭代码

3. 正常结果: 按预期顺序关闭. 暂停3秒后,输出对应的关闭日志

异常:

1. 都打印出了对应的关闭日志.但是没有暂停3秒.

深入探究:

1.  对应的线程池里并没有执行 worker. 还以为我自己对线程池的 shutdown和 await 的理解错误了. 细细又看了一遍源码.还研究了下interruptIdleWorkers里的线程 interrupt方法,把对应线程都中断了. 但是runnable 的 sleep又没有打印出被interrupt的错误日志. 以为自己对interrupt 理解错了.又学习了一遍interrupt.

2. 最终发现原来的PrototypeScopeBean和 close 时的PrototypeScopeBean不是同一个 bean

3. 回过头看 spring 的关闭流程代码.

发现发起 event 时会回调

1. sington 实例,

2. get 新的 prototype bean

而我的线程池是非 static 的,导致出错. 无法完成优雅关闭.

xml 配置的都会生成新的 bean 定义.

发现了通知的 list,通过

defaultRetriever.applicationListeners  笔者注释: 实现了 listener 的sington 的实例.

NOTE: 如果 bean 有@scope 的 prototype 注解,但是 xml 里又配置了 <bean,id 不一致> 但是没有配置 scope. 会生成两个 beanDefinition,且一个是 sington,一个是 prototype. 注解不影响 xml 的属性. 单例的实例会主动生成.

defaultRetriever.applicationListenerBeans 笔者注释:  字符串 ,所有实现了listener的 beanDefinition Name

NOTE:每个在 annotation 注解 和 xml 配置解析后都会生成一个 beanDefinition. 只有sington才会生成直接生成实例. 可在 getBean(class)的代码里证明.

总结:

1.  beanDefinition 何时生成?

id 是@service 的 value, xml 配置里的 id .一个sington 配置两遍,会有两个 beanDefinition. 注解解析也有. 同时生成. 如果 id 一致,xml 会覆盖注解.

2. 实例何时生成?

singoton: xml 定义解析时,注解解析时

prototype: getBean 时. 一旦有多个 beanDefinition,通过getBean(class)会报错 bean 数量不对.

3. spring 事件通知通知哪些对象?

1. 所有继承了 listener 的 sington 实例

2. 新建一个 prototype 的实例,并且调用. 所以 prototype 里被事件处理的东西最好是 static 的. 不然没有意义.这点面向对象写法容易出错,且容易内存泄露.新建大量的线程池.线程池何时被回收.?

4. prototype的特点是什么?

  1.  getBean("name")时 或者被注入autowired injected时会自动生成一个 bean

2. getBean(class) 在只有一个 beanDefinition 时不会抛错. 不要 xml 写了一个,注解又有一个.

NOTE: 这个接口会有锁,并发下性能比较差. 3.1.2

附录:

事件通知堆栈:

  • "Thread-0"@2,180 in group "main": RUNNING
  • onApplicationEvent():48, PrototypeScopeBean {com...test.unmock.test}
  • onApplicationEvent():15, PrototypeScopeBean {com..test.unmock.test}
  • multicastEvent():97, SimpleApplicationEventMulticaster {org.springframework.context.event}
  • publishEvent():324, AbstractApplicationContext {org.springframework.context.support}
  • doClose():1025, AbstractApplicationContext {org.springframework.context.support}
  • run():958, AbstractApplicationContext$1 {org.springframework.context.support}

从线上问题谈spring生命周期类lifeCycle类和bean的生命周期

从prototype beandefinition 谈 spring 的关闭流程和 prototype 的特性的更多相关文章

  1. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...

  2. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  3. spring mvc处理流程概述

    大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节.Spring为展现层提供了一个优秀的Web框架-Spring MVC.和众多其他Web框架一样,它基于MVC设计理念,此外,它采 ...

  4. Spring MVC 编程流程步骤

    Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...

  5. spring cloud: 关闭ribbon负载均衡

    spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...

  6. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  7. 浅谈Spring中的Quartz配置

    浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...

  8. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  9. 一文读懂Spring MVC执行流程

    说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图:   ...

随机推荐

  1. 要单独拿出来讲的a标签

    a标签的属性 href属性赐予a标签力量:href属性指定要通过a标签借助浏览器请求的资源,可以是图片.视屏.网站.音频等.不加herf属性的a标签就是一个没有任何特殊样式和功能的文本容器. targ ...

  2. PJzhang: github与出口管制·说明条款

    猫宁!!! 参考链接:https://www.infoq.cn/article/KMl2EO*PSMxIkVREiYvC https://help.github.com/en/articles/git ...

  3. C 语言实例 - 字符串排序

    C 语言实例 - 字符串排序 C 语言实例 C 语言实例 按字典顺序排序. 实例 #include<stdio.h> #include <string.h> int main( ...

  4. Markdown - 如何给文本加下划线

    解决方法 Markdown可以和HTML的语法兼容,可以通过HTML的标签来实现效果: 写法 效果 <u>下划线</u> 下划线 这里解释下,u指的是underline下划线. ...

  5. 计算机中如何实现除数是2的幂次的除法【转载自CSDN】

    前言: 本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目.结果傻眼了,又尼玛不会了.........第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到 ...

  6. Linux--NiaoGe-Service-08(路由)

    路由 Linux系统下的路由表是由小到大排列的,即C类地址-->B类地址-->A类地址-->0.0.0.0(默认路由). Linux系统中使用route命令查看路由表 [root@w ...

  7. Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application --读书笔记

    Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application 第1章和第2章讲述可伸 ...

  8. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  9. vue-quill-editor 富文本编辑器插件介绍

    Iblog项目中博文的文本编辑器采用了vue-quill-editor插件,本文将简单介绍其使用方法. 引入配置 安装模块 npm install vue-quill-editor --save in ...

  10. .NET Core 1.0 CentOS7 尝试(二、VSCode安装)

    晚上继续摸索~~  一.VSCode安装 下载VSCode,地址:https://code.visualstudio.com/Docs/?dv=linux64_rpm 直接双击安装或者使用rpm -i ...