`

Java三大器之拦截器(Interceptor)的实现原理及代码示例

 
阅读更多

http://blog.csdn.net/reggergdsg/article/details/52962774

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 
  ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能: 
  • MessageSource, 提供国际化的消息访问 
  • 资源访问,如URL和文件 
  • 事件传播 
  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层 
1.利用MessageSource进行国际化 
  BeanFactory是不支持国际化功能的,因为BeanFactory没有扩展Spring中MessageResource接口。相反,由于ApplicationContext扩展了MessageResource接口,因而具有消息处理的能力(i18N),具体spring如何使用国际化,以后章节会详细描述。 

2.强大的事件机制(Event) 
  基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。 
ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的,和java swing中的事件机制一样。即当ApplicationContext中发布一个事件的时,所有扩展了ApplicationListener的Bean都将会接受到这个事件,并进行相应的处理。 

Spring提供了部分内置事件,主要有以下几种: 
ContextRefreshedEvent :ApplicationContext发送该事件时,表示该容器中所有的Bean都已经被装载完成,此ApplicationContext已就绪可用 
ContextStartedEvent:生命周期 beans的启动信号 
ContextStoppedEvent: 生命周期 beans的停止信号 
ContextClosedEvent:ApplicationContext关闭事件,则context不能刷新和重启,从而所有的singleton bean全部销毁(因为singleton bean是存在容器缓存中的) 

  虽然,spring提供了许多内置事件,但用户也可根据自己需要来扩展spriong中的事物。注意,要扩展的事件都要实现ApplicationEvent接口。 

3.底层资源的访问 
  ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader 

4.对Web应用的支持 
  与BeanFactory通常以编程的方式被创建不同的是,ApplicationContext能以声明的方式创建,如使用ContextLoader。当然你也可以使用ApplicationContext的实现之一来以编程的方式创建ApplicationContext实例 。 
 

ContextLoader有两个实现:ContextLoaderListenerContextLoaderServlet。它们两个有着同样的功能,除了listener不能在Servlet 2.2兼容的容器中使用。自从Servelt 2.4规范,listener被要求在web应用启动后初始化。很多2.3兼容的容器已经实现了这个特性。使用哪一个取决于你自己,但是如果所有的条件都一样,你大概会更喜欢ContextLoaderListener;关于兼容方面的更多信息可以参照ContextLoaderServlet的JavaDoc。

这个listener需要检查contextConfigLocation参数。如果不存在的话,它将默认使用/WEB-INF/applicationContext.xml。如果它存在,它就会用预先定义的分隔符(逗号,分号和空格)分开分割字符串,并将这些值作为应用上下文将要搜索的位置。ContextLoaderServlet可以用来替换ContextLoaderListener。这个servlet像listener那样使用contextConfigLocation参数。


5.其它区别 
  1).BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。 

  2).BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册

分享到:
评论

相关推荐

    利用反射和动态代理机制实现自定义拦截器Interceptor

    要实现自定义拦截器Interceptor,首先我们需要了解反射机制和动态代理的工作原理。反射机制是指在Java程序中,可以在运行时动态地获取和修改类的结构和行为,而不是在编译时确定的。动态代理是指在运行时动态地生成...

    SpringBoot拦截器原理解析及使用方法

    拦截器通常通过实现HandlerInterceptor接口来完成拦截逻辑,这个接口提供了三个主要方法:preHandle、postHandle和afterCompletion。 - preHandle方法在请求处理之前进行调用,也就是Controller方法被调用之前。...

    Struts2 拦截器 Interceptor

    定义拦截器类**:假设我们有一个名为`ReIn`的拦截器类,该类需要实现`Interceptor`接口,并重写三个方法:`intercept()`、`init()`和`destroy()`。 ```java public class ReIn implements Interceptor { @...

    拦截器的使用示例Interceptor

    在Java Web开发中,拦截器(Interceptor)是一种重要的设计模式,它主要用于在请求处理之前、之后或处理过程中执行一些预定义的任务。拦截器通常被应用于MVC(Model-View-Controller)框架,如Spring MVC,Struts等...

    java 拦截器实现

    在Java中,有两种主要的方式来实现拦截器:一种是基于接口的JDK动态代理,另一种是基于类的CGLIB动态代理。这里我们将深入探讨这两种方式以及与责任链模式的关系。 首先,让我们理解什么是拦截器。拦截器是一种设计...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    Java SpringBoot实现的过滤器(和拦截器)控制登录页面跳转

    本项目主要关注的是如何使用过滤器(Filter)和拦截器(Interceptor)来实现登录页面的控制与跳转。以下是对这些知识点的详细说明: 1. **SpringBoot**: SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...

    struts2 Interceptor拦截器

    2. **如何实现**:Struts2提供了一个灵活的Interceptor框架,开发者可以通过实现Interceptor接口来自定义拦截器,也可以通过继承已有的拦截器实现来进行扩展。 3. **配置方式**:Interceptor的配置通过Struts2的配置...

    详解Retrofit Interceptor(拦截器) 拦截请求并做相关处理

    Retrofit Interceptor(拦截器) 的使用和实现 Retrofit Interceptor(拦截器) 是一个非常重要的组件,在 Retrofit 框架中扮演着关键角色。拦截器可以拦截请求并做相关处理,典型的处理方式是修改 header,但我们也...

    jfinal中拦截器(Interceptor)的参数注入

    jfinal中拦截器(Interceptor)的参数注入jfinal中拦截器(Interceptor)的参数注入

    浅谈Struts2拦截器的原理与实现.docx

    3. **实现拦截器** 实现Struts2拦截器需要继承`com.opensymphony.xwork2.interceptor.Interceptor`接口并实现其中的三个方法:`init()`、`destroy()`和`intercept()`。`init()`方法在程序启动时调用,`destroy()`在...

    ip黑白名单拦截器java示例

    而"拦截器代码(可根据业务进行修改)"这部分,可能是一个Java类,它实现了拦截器接口,如Servlet的Filter或Spring框架的Interceptor。这个类会拦截每个HTTP请求,检查请求头中的`X-Forwarded-For`或`RemoteAddr`...

    Java Struts 实现拦截器

    ### Java Struts 实现拦截器的关键知识点 #### Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。它利用一系列的组件来处理用户请求并生成响应。其中,拦截器...

    STRUTS2:拦截器Interceptor

    STRUTS2:拦截器Interceptor

    Struts2拦截器的实现原理(csdn)————程序.pdf

    下面我们将深入探讨Struts2拦截器的实现原理。 首先,让我们理解一下拦截器的基本概念。拦截器是基于Java的动态代理机制实现的,它可以看作是一个过滤器,它在Action调用前后执行一些额外的任务,如日志记录、权限...

    struts2 拦截器interceptor教程 示例源码

    struts2 拦截器_教程.zip

    struts2 拦截器的使用(继承抽象拦截器)

    在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照配置的顺序形成一个拦截器链。每个拦截器都可以在Action执行之前或之后执行特定的任务,而无需修改Action本身。这遵循了“开闭原则”,使得代码更易于...

Global site tag (gtag.js) - Google Analytics