`
sing100star
  • 浏览: 29065 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Aop拦截链的简单实现

阅读更多

 

    在 Spring 中有拦截链这一说法,如何通过 JDK 实现一个简易的拦截链呢。起初的想法是动态代理模式加上链表,但是发现存在一个问题,被拦截的方法会多次被调用,因此又想到一个办法:使用用动态代理机制和装饰器模式。

       为什么采用装饰器模式。理由如下,装饰器本质上是一条调用链,由内而外调用,这恰好符合拦截链的形式。

       具体应该怎么做?

    仔细想想设计模式中的代理模式是如何实现的。如图所示

 

    我所要所要做的就是解决代理类的生成问题。为此我把【装饰器模式】引入其中

    修改后的类图如下所示

    其中 左边的为代理模式,右边为装饰器模式。左边的代理类是由右边的抽象拦截器生成

    抽象拦截器的作用是: 1 、封装 InvocationHandler 类。 2 、生成代理类。 3 、装饰模式的核心。

 

    废话不多写,来个具体的例子

 

 

public interface Messagable {
	public void send(String message,String target);

}


 

public class Telephone implements Messagable {

	public void send(String message, String target) {
		System.out.println("Telephone: " + target + " " + message);
	}

}

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public abstract class AopChain  implements InvocationHandler{

	protected Object srcObject;
	public Object bind(Object obj){
		srcObject = obj;
		return Proxy.newProxyInstance(

				obj.getClass().getClassLoader(),
				obj.getClass().getInterfaces(),
                                this);
	}
}

 

public class Dater extends AopChain {
	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
        	System.out.println("该函数发生于"+ new Date());
		return arg1.invoke(srcObject, arg2);
	}

}


 

import java.lang.reflect.Method;
public class ShowMethodName extends AopChain {

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("方法名为 "+method.getName());
		return method.invoke(srcObject, args);
	}
}

 

public class TestAopChain {
	public static void main(String[] args){
        Messagable telephone = new Telephone();
	Messagable date = (Messagable)new Dater().bind(telephone);
	Messagable method = (Messagable)new ShowMethodName().bind(date);
        method.send("你在哪里?","小明");
	}
}

 

运行结果如下
方法名为 send
该函数发生于Sun Jan 31 20:08:50 CST 2010
Telephone: 小明 你在哪里?

 

   当然,这里还有很多不足,但是核心的一点,如何实现拦截这一问题已经做到。

   如果还有问题,请大家多多指教。

 

  • 大小: 7.6 KB
  • 大小: 20 KB
  • 大小: 21.2 KB
0
2
分享到:
评论

相关推荐

    模拟Struts责任链工作流及简单AOP实现

    在Java中,Spring框架提供了强大的AOP支持,但Struts2也提供了一种简单的AOP实现,主要用于拦截Action执行前后的操作,比如日志记录、事务管理等。 在Struts2中实现AOP主要通过自定义拦截器来完成。首先,我们需要...

    java 拦截器实现

    Java拦截器是面向切面编程(AOP)的重要组成部分,它允许我们在方法调用前后插入自定义的行为。在Java中,有两种主要的方式来实现拦截器:一种是基于接口的JDK动态代理,另一种是基于类的CGLIB动态代理。这里我们将...

    Struts2拦截器实现权限控制demo

    在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...

    Struts拦截器及token拦截器防止重复提交例子源码

    1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...

    SpringAOP原理及拦截器.docx

    Spring AOP的实现主要依赖于拦截器(Interceptor)。拦截器在方法调用前后执行,形成一个拦截器链。通过定义拦截器,开发者可以定义在何时何地执行特定的逻辑,而无需直接修改原始业务代码。这极大地增强了代码的...

    AopProxyDemo.rar

    本示例"AopProxyDemo"旨在通过JDK动态代理来演示AOP拦截器栈的实现。下面我们将深入探讨JDK动态代理及其在AOP中的应用。 首先,我们需要理解JDK动态代理的工作原理。JDK动态代理是Java提供的一种机制,可以在运行时...

    Android-Jet-AOP一个AndroidAOP框架

    Android-Jet-AOP便是一个专为Android平台设计的AOP框架,它借助注解和AspectJ技术,使得在Android应用中实现AOP变得简单易行。 ### 一、面向切面编程(AOP) AOP的核心理念是将程序中的关注点分离,关注点可以理解...

    Spring之AOP介绍

    在Spring AOP中,切面可以由Advisor(通知+切入点)或者拦截器实现。 - **通知**(Advice):定义了切面如何改变程序行为的信息,它是在特定连接点上执行的动作。 - **切入点**(Pointcut):定义了何时何处执行通知...

    ssm_拦截器demo

    在这个"ssm_拦截器demo"中,我们可以看到一个基于SSM的简单项目配置,以及一个自定义拦截器的实现,这是学习SSM框架和理解拦截器机制的好材料。 首先,我们来看看SSM框架的基础。Spring是整个项目的基石,它提供了...

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

    Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加或删除功能。拦截器是可插拔的,可以在请求到达Action之前或之后执行...

    以注解方式模拟Spring IoC AOP

    在调用目标方法之前,遍历拦截器链并执行相应的切面逻辑。 ```java // 自定义切面注解 @Retention(RetentionPolicy.RUNTIME) @interface BeforeAdvice {} // 拦截器接口 interface Advice { void execute(); } /...

    struts2 实现增删改查。以及拦截器的功能实现源码

    例如,一个简单的登录拦截器可能会检查用户是否已登录,如果没有,则重定向到登录页面。另一个例子是,一个性能监控拦截器可以在Action开始前记录时间戳,在Action执行后计算并记录执行时间。 在"struts0601"这个...

    struts2拦截器国际化

    Struts2的拦截器是一种AOP(面向切面编程)的概念,它在Action调用前后执行特定的逻辑,如日志记录、权限验证、数据校验等。拦截器通过配置在struts.xml或struts-plugin.xml文件中,按照定义的顺序进行调用。每个...

    struts1.2拦截器使用插件

    拦截器在Action调用前后执行,形成一个拦截链。当一个请求到达时,Struts框架会按照配置的顺序依次调用这些拦截器,然后执行Action,最后再按逆序返回。通过这种方式,我们可以添加如日志、权限验证、事务管理等通用...

    SpringMVC拦截器实现登录认证

    通常是在`web.xml`中配置前端控制器DispatcherServlet,然后在`DispatcherServlet`的配置文件(如`servlet-context.xml`)中定义拦截器链: ```xml <!-- 配置Spring MVC --> xmlns:xsi=...

    springboot拦截器代码

    拦截器是AOP(面向切面编程)的一种表现形式,它可以在方法调用前后执行特定的操作,如日志记录、权限检查、性能统计等。在Spring MVC中,拦截器可以拦截HTTP请求,进一步增强我们的应用程序功能。 要创建一个...

    struts2的自定义拦截器例子

    在Struts2中,拦截器是基于责任链模式实现的,多个拦截器可以形成一个拦截器栈,按顺序执行。 要创建自定义拦截器,我们需要遵循以下步骤: 1. **定义拦截器类**:创建一个实现`Interceptor`接口或者继承`...

    SpringMVC学习(十二)——SpringMVC中的拦截器

    例如,我们可以创建一个简单的登录拦截器: ```java public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse...

    struts拦截器和url放行

    Struts拦截器...`LoginInterceptor.java`作为示例,展示了如何实现一个简单的登录拦截器,确保只有已登录的用户才能访问特定的资源。理解并熟练运用这些概念,可以帮助开发者构建更加健壮和安全的Web应用。

    struts2.0拦截器完整

    在Struts2中,拦截器是基于Java的动态代理实现的,它遵循责任链模式,允许一系列拦截器按照预定义的顺序执行。 2. **拦截器的生命周期** - **初始化**:当Struts2启动时,配置的拦截器会按声明顺序被创建。 - **...

Global site tag (gtag.js) - Google Analytics