从prototype beandefinition 谈 spring 的关闭流程和 prototype 的特性
背景介绍:
服务端期望使用 面向对象编程, 和 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 的特性的更多相关文章
- 浅谈Spring MVC知识
关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...
- spring mvc处理流程概述
大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节.Spring为展现层提供了一个优秀的Web框架-Spring MVC.和众多其他Web框架一样,它基于MVC设计理念,此外,它采 ...
- Spring MVC 编程流程步骤
Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...
- spring cloud: 关闭ribbon负载均衡
spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...
- Ioc容器beanDefinition-Spring 源码系列(1)
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 一文读懂Spring MVC执行流程
说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: ...
随机推荐
- 编译keepalived 方法
作者的环境: redhat 6.5 64 位版 在编译keepalived 前,需要提前给环境安装两个依赖包--zlib和openssl 编译 zlib 库 参考作者之前的博客 http://www. ...
- 单片机的C语言中位操作用法
在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点.这也是在各个领域中都可以看到C的重要 ...
- native-echarts 在安卓上无法显示出来
1.native-echarts 的配置是百度echarts 2.模拟器上试了很多次都显示不出来(具体不清楚,我的是这样) 3.真机测试可以显示图表,以下是配置: a.将node_modules\na ...
- python_argparse
使用python argparser处理命令行参数 #coding:utf-8 # 导入模块 import argparse # 创建ArgumentParser()对象 parser = argpa ...
- Qt 2D绘图之六:图形视图框架的事件处理与传播
一.简介 图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项.而对于键盘事件,它会传递给获得焦点的图形项,可以使用QGraphicsScene类的setFocusI ...
- Python type class metaclass
'type' 是 python built-in metaclass 其他继承自 ‘type’的class都可以是 Metaclass 子类可以继承父类的metaclass 然而 __metaclas ...
- 转 OUI and OPatch Do Not Recognize JDK/JRE on Windows
issue 1: 新覆盖的opatch 提示,无法opatch 报错 此时不应有1.6 D:\app\Administrator\product\11.2.0\dbhome_1\OPatch\ocm\ ...
- String的内存和intern()方法
一.关于常量池 字符串在Java中用的非常得多,Jvm为了减少内存开销和提高性能,使用字符串常量池来进行优化. 在jdk1.7之前(不包括1.7),Java的常量池是在方法区的地方,方法区是一个运行时 ...
- pm2日志切割
此为pm2 日志按每天切割的示例 1.在crontab里添加定时任务 * * * >& 2.cutlog.sh 代码内容 #!/bin/bash CURPATH="/var/l ...
- html 手机端click 事件延迟问题(fastclick.js使用方法)
下载地址: fastclick.js 为什么存在延迟? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间.为什么这么设计呢? 因为它想看看你是不是要进行双击 ...