Spring框架之内省

JavaBean规范:
1)JavaBean类必须是一个public的类;
2)JavaBean类必须是有一个空的构造函数;
3)JavaBean的变量应为private;
4)JavaBean的属性通过getter/setter访问;

反射与内省
1)反射可以操作各种类属性,设置属性值可不用调用setter方法;
2)内省是Java提供的一套API,用于访问某个属性的getter/setter方法。内省是通过反射来操作JavaBean属性,设置属性值必须调用getter/setter方法

内省是基于反射实现的。

一、IntrospectorCleanupListener

IntrospectorCleanupListener是一个监听器:当关闭WEB应用时,刷新JDK的javaBeans缓存。
该监听器需注册到web.xml,用于保证适当地释放WEB应用级别的类加载器和它加载的类。
如果JavaBean内省用于分析应用程序类,系统级别的内省缓存将强引用这些应用程序类。因此,当WEB应用关闭时,这些应用程序类和应用类加载器将不能被垃圾回收器清理。IntrospectorCleanupListener监听器实现适当清理这些强引用,从而让垃圾回收器能清理这些应用程序类和应用类加载器。
不幸的是,清理内省的唯一方法是刷新整个缓存,因为没办法确定应用程序类引用。这将删除所缓存的内省结果,对于服务器中的其他应用也是如此。

注意:
1)当应用范围内是使用Spring的Bean基础设施时,该监听器是不需要的。因为Spring自身内省结果缓存会立即从JavaBean内省缓存中刷新分析类,而且在应用自身类加载器内持有一个缓存。

尽管Spring自身不会创建JDK内省漏洞,但请注意,该监听器应该被用于如下场景:Spring框架中的类驻留在通用类加载器(如系统类加载器)。在这种场景下,该监听器将适当清理Spring的内省缓存。
应用程序类几乎不需要直接使用JavaBean内省,所以通常不是导致内省资源泄漏的原因。反而,许多库和框架没有清理内省:比如Struts和Quartz

注意:
1)一个内省漏洞将导致整个WEB应用的类加载器不会被垃圾回收,这就是导致在WEB应用关闭后,你还可看到所有应用静态类资源(如单例),但这不是这些类的错!
2)IntrospectorCleanupListener监听器应该放在web.xml中的任何一个监听器之前,比如ContextLoaderListener

二、CachedIntrospectionResults

CachedIntrospectionResults是一个Spring内部使用的类,用于缓存一个JavaBean的属性信息。
对于一个应用级别的类加载器的自身描述缓存来说是需要的,而不是依赖于JDK系统范围内BeanInfo缓存,其主要目的是为了防止在类加载器关闭时出现内存泄漏。

注意:
1)CachedIntrospectionResults是采用工厂设计模式创建实例且是静态缓存的,所以不用在创建每一个JavaBean时都去创建CachedIntrospectionResults实例。

为了高效缓存,需满足一些前提条件:
1)将Spring Jar包和应用程序中的类使用相同的ClassLoader,在任何情况下允许在应用程序生命周期中一起清除缓存。
2)对于web应用程序,可以考虑在web.xml中IntrospectorCleanupListener。在多个类加载器布局的情况下,它也允许有效的缓存。

如果没有设置IntrospectorCleanupListener,CachedIntrospectionResults将返回基于弱引用的缓存模型——每当垃圾回收器删除它们时,就会重新创建请求对象引用。在这种情况下,考虑使用achedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME——spring.beaninfo.ignore属性配置(true/false),默认为false

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiabaoyu19lindaiyu/article/details/80097731
文章标签: spring
个人分类: java
上一篇Java枚举类型
下一篇山脚下(第0004步)——JAVA集合与泛型
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭