没有合适的资源?快使用搜索试试~ 我知道了~
Spring源码学习十三:IntrospectorCleanupListener解析1
需积分: 0 0 下载量 131 浏览量
2022-08-04
17:09:21
上传
评论
收藏 739KB PDF 举报
温馨提示
试读
1页
Spring源码学习十三:IntrospectorCleanupListener解析1
资源详情
资源评论
资源推荐
在分析IntrospectorCleanupListener之前,先解下Introspector。Introspector是JDK
中java.beans包下的类,它为标JavaBean提供种解原类法、属性和事件的标准
法。通俗的说,就是可以通过Introspector构建个BeanInfo对象,这个BeanInfo对
象中包含标类中的属性、法和事件的描述信息,然后可以使这个BeanInfo对象对
标对象进相关操作。
下看个简单的示会很容明。为简单,Student类中只有个name属性。
1 结果输出:Student{name='张三'}
通过查看Introspector.getBeanInfo法的源码会发现,Introspector在构建个BeanInfo
对象的时候,会将构建的BeanInfo对象和原类缓存到个Map中,源码如下。
通 过 上 的 代 码 可 以 得 出 , Introspector 间 接 持 有 BeanInfo 的 强 引 。 如 果 使
Introspector操作很多类,那么Introspector将间接持有这些BeanInfo的强引。在发
垃圾收集的时候,检测到这些BeanInfo存在引链,则这些类和对应的类加载将会被
垃圾收集回收,进导致内存泄。所以,为解决这个问题,在使Introspector操作
完成后,调Introspector类的flushCaches法清除缓存。
通过上的代码会发现,清除的时候是清空整个缓存,因为没有很好的办法来确定每个
缓存是属于哪个应的,所以清除的时候会清除所有应的缓存。
IntrospectorCleanupListener解析
上分析Introspector的作和影响,那IntrospectorCleanupListener和Introspector有
么关系呢?
IntrospectorCleanupListener是spring-web jar中的类,源码如下。
IntrospectorCleanupListener实现ServletContextListener接,也就是说,在web容
初始化(准确的说是在filters或servlets初始化之前)的时候会执contextInitialized法,在
ServletContext 销 毁 ( 准 确 的 说 是 在 filters 和 servlets 销 毁 之 后 ) 的 时 候 会 执
contextDestroyed法。从图中contextDestroyed法,可以看到在销毁ServletContext
的 时 候 调 Introspector.flushCaches 法 , 清 空 对 应 缓 存 。
IntrospectorCleanupListener中为么要这么做?难道是Spring使Introspector操作后
没有清空对应缓存?查看IntrospectorCleanupListener类的源码,会发现有这样段标
注。
意是说,在使Spring本身的时候并需要使此监听,因为Spring的内部机制
会即清空对应的缓存。虽然,Spring本身存在这样的问题,但是如果和其它框架结合
使,其它框架有这个问题,如Struts、Quartz等,那就需要配置这个监听,在销毁
ServletContext的时候清空对应缓存。
有点需要注意的是,像这样个简单的Introspector内存泄将会导致整个应的类加载
会被垃圾收集回收,如果有内存泄的问题,可以考虑此因素。
配置IntrospectorCleanupListener
在以往的作经历中,多次看到在web.xml中将IntrospectorCleanupListener配置成第
个listener。
其实,看过源码的都知道,官的表述是必须将此监听配置成web.xml中的第个
listener,才能在合适的时间发挥最有效的作。
原因其实很简单,在Servlet3.0规范之前,监听的调是随机的,从Servlet3.0开始,
监听的调顺序是根据其在web.xml中配置的顺序,并且实现ServletContextListener的
监听,contextInitialized法调顺序是按照在web.xml中配置的顺序正序依次执,
contextDestroyed法的调顺序是按照在web.xml中配置的顺序逆序依次执。所以,
如 果 IntrospectorCleanupListener 被 配 置 成 第 个 listener , 那 么 它 的
contextDestroyed法将最后个执,将发挥最有效的清除作;如果是,那么可
能会残未被清除的缓存。
LauraKuang
- 粉丝: 17
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0