`
pavel
  • 浏览: 930914 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

过滤器总结一(IntrospectorCleanupListener)

阅读更多

org.springframework.web.util.IntrospectorCleanupListener监听器主要负责处理由JavaBean Introspector使用而引起的缓冲泄露, 它是一个在web应用关闭时清除JavaBean Introspector的监听器,在web.xml中注册这个listener可以保证在web应用关闭的时候释放掉与这个web应用相关的class loader和由它管理的类.
  如果你使用了JavaBeans Introspector来分析应用中的类.Introspector缓冲中会保留这些类的引用.结果在你的应用关闭的时候,这些类以及web应用相关的class loader没有被垃圾回收.
  不幸的是,清除Introsepctor的唯一方法是刷新整个缓冲,这是因为我们没有办法判断哪些是属于你的应用的引用,所以删除被缓冲的Introspection会导致把这台电脑上的所有应用的introspection都删掉.
  spring托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javabeans introspector缓冲中清除掉.
应用程序中的类从来不直接使用JavaBeans Introspector,所以他们一般不会导致内部查看资源泄露,但是一些类库和框架往往会产生这个问题.如:Struts和Quartz.单个的内部查看泄露会导致整个的web应用的类加载器不能进行垃圾回收,在web应用关闭之后,你会看到此应用的所在静态资源如单例,这个错误不是由该类自身引起的.

 

java内省(Introspector)简介

 

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
import java.beans.BeanInfo;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
import java.beans.Introspector;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
import java.beans.PropertyDescriptor;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
/**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
  * 内省演示例子                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           *  */                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
public class IntrospectorDemo {                                                                                                                                          

  public static void main(String[] args) throws Exception{                                                                                                                  

 IntrospectorDemo demo = new IntrospectorDemo();                                                                                                                       

  demo.setName( "Winter Lau" );                                                      

 // 如果不想把父类的属性也列出来的话,                                              

// 那 getBeanInfo 的第二个参数填写父类的信息                                       

BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object. class );                                                                                                 

PropertyDescriptor[] props = bi.getPropertyDescriptors();  
        for ( int i=0;i<props.length;i++){   

  System.out.println(props[i].getName()+ "=" +prop[i].getReadMethod().invoke(demo,null));                                                                                                                                                                                            
        }                                                                           

    }                                                                              

 

 

  public String getName() {                        

                                     

      return name;                                    

                            

    }       

     public void setName(String name) {                                                                                                         
      this .name=name;   

}                                                                                                                                             
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
Web 开发框架 Struts 中的 FormBean 就是通过内省机制来将表单中的数据映射到类的属性上,因此要求 FormBean 的每个属性要有 getter/setter 方法。但也并不总是这样,什么意思呢?就是说对一个 Bean 类来讲,我可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。

 

分享到:
评论

相关推荐

    过滤器图形符号(标准图形)

    - **说明**: 双筒过滤器由两个过滤器组成,其中一个处于工作状态,另一个作为备用或正在维护中。这样的设计可以在不停机的情况下切换过滤器进行清洁或更换,特别适合于对连续性和可靠性要求较高的场合。 #### 应用...

    vue 内置过滤器的使用总结(附加自定义过滤器)

    Vue还支持过滤器的链式调用,这意味着一个过滤器的输出可以被作为下一个过滤器的输入继续处理。链式调用的语法如下: ``` {{ message | filterA | filterB }} ``` 在此例中,`message`先被`filterA`处理,其结果再由...

    filter过滤器 总结

    非常实用的过滤器,自己在网上找了很多资料,总结了一套切实可用的filter文档,希望能帮助你,完成你的工作

    servlet过滤器实例经典过滤器

    总结来说,Servlet过滤器是Java Web开发中不可或缺的一部分,它提供了一种灵活的方式,让我们可以在请求和响应之间插入自定义的处理逻辑。通过实例化和配置过滤器,我们可以实现诸如字符集转换、权限控制、日志记录...

    STM32的CAN过滤器详解.pdf

    每组过滤器可以是1个、2个或4个过滤器,这些过滤器并联工作,只要报文通过任意一个过滤器,就会被视为有效并进入相应的FIFO。 过滤器的工作模式主要有两种:标识符列表模式和标识符屏蔽位模式。在标识符列表模式下...

    管道过滤器程序,主要用java实现

    管道过滤器模式是一种设计模式,它在软件工程中被广泛应用于数据处理,特别是在Java编程语言中。这种模式通过连接一系列的处理组件(过滤器),每个组件执行特定的任务,来实现复杂的数据转换。在这个场景中,"管道...

    过滤器文档过滤器使用中的方法过滤器.pdf

    总结起来,过滤器是Web应用中不可或缺的一部分,它们提供了强大的功能,如数据安全、编码一致性以及自动化操作。通过合理地使用过滤器,开发者可以更高效地管理和控制Web应用的流量,提高应用的安全性和用户体验。...

    管道过滤器(软件体系结构)

    首先使用一个过滤器进行图像加载,然后通过另一个过滤器进行颜色空间转换,接着是噪声滤除、边缘检测等多个过滤器。每个过滤器专注于完成特定的任务,最终通过管道连接起来形成完整的处理流程。 #### 结论 管道...

    Struts 2 过滤器的总结

    Struts 2框架中的过滤器(Filter)是Servlet规范的一部分,主要用于在请求到达目标资源(如JSP、Servlet或其他资源)之前或响应返回客户端之前进行预处理或后处理。过滤器能够检查和修改`ServletRequest`和`Servlet...

    过滤器链的一个小Demo

    总结来说,过滤器链是Java Web开发中一种强大的工具,它允许开发者灵活地控制请求和响应的处理流程,提高代码复用性,降低系统复杂性。通过"FilterChainDemo"这样的实践案例,我们可以深入理解过滤器链的工作原理,...

    bxCAN的过滤器的4种工作模式以及使用方法总结

    我们可以创建一个过滤器,将这两个ID添加到列表中。具体配置过程如下: 1. **初始化过滤器配置结构体:** - 设置过滤器的工作模式为列表模式。 - 设置过滤器的规模,比如32位ID。 2. **添加报文ID:** - 将0x...

    Servlet过滤器的简单使用源码+文档

    在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...

    过滤器(java编写的过滤器)

    在Java Web开发中,过滤器(Filter)是一种非常重要的技术组件,它可以在请求到达目标资源(如Servlet或JSP页面)之前或之后执行某些操作。过滤器可以用来实现各种功能,如用户认证、权限检查、编码转换、日志记录等。...

    servlet 过滤器做的简单登陆demo

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达目标Servlet之前或之后对请求和响应进行处理。在这个“servlet过滤器做的简单登陆demo”中,我们将探讨如何利用过滤器实现一个基础的登录验证...

    多介质过滤器设计规范

    总结来说,多介质过滤器设计规范是一项综合性的技术文件,它详细规定了过滤器的设计参数、性能指标、材料选用、供货内容以及后期服务等各个方面,旨在保证过滤器在实际运行中能有效、安全地处理各类水质问题,满足...

    java * Repeatable 过滤器 * Repeatable 过滤器 * Repeatable 过滤器

    java * Repeatable 过滤器 * Repeatable 过滤器 * Repeatable 过滤器java * Repeatable 过滤器 * Repeatable 过滤器 * Repeatable 过滤器java * Repeatable 过滤器 * Repeatable 过滤器 * Repeatable 过滤器java * ...

    基于管道过滤器风格的单词排序程序

    在IT领域,基于管道过滤器风格的编程是一种常见的设计模式,尤其在处理数据流时非常有效。这种风格的程序由一系列处理单元(过滤器)组成,每个单元接收输入,进行处理,然后将结果传递给下一个单元,就像流水线上的...

    JAVA过滤器 过滤器

    JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器

    包含过滤器的一个简单登陆实例

    本实例“包含过滤器的一个简单登录实例”将引导我们了解如何在实际项目中运用过滤器进行用户验证,确保只有合法用户才能访问受保护的资源。 过滤器在Java Web开发中被广泛应用,它们是Servlet规范的一部分,定义在`...

    Java过滤器,字符过滤,标签过滤

    总结来说,这个Java过滤器小样例提供了字符过滤和标签过滤的实现,有助于提升Web应用的安全性和数据一致性。通过研究这个项目,开发者可以学习到如何在实际项目中应用过滤器,以及处理字符编码问题,这对于任何涉及...

Global site tag (gtag.js) - Google Analytics