在
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
分享到:
相关推荐
在Java中,Spring框架提供了强大的AOP支持,但Struts2也提供了一种简单的AOP实现,主要用于拦截Action执行前后的操作,比如日志记录、事务管理等。 在Struts2中实现AOP主要通过自定义拦截器来完成。首先,我们需要...
Java拦截器是面向切面编程(AOP)的重要组成部分,它允许我们在方法调用前后插入自定义的行为。在Java中,有两种主要的方式来实现拦截器:一种是基于接口的JDK动态代理,另一种是基于类的CGLIB动态代理。这里我们将...
在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
Spring AOP的实现主要依赖于拦截器(Interceptor)。拦截器在方法调用前后执行,形成一个拦截器链。通过定义拦截器,开发者可以定义在何时何地执行特定的逻辑,而无需直接修改原始业务代码。这极大地增强了代码的...
本示例"AopProxyDemo"旨在通过JDK动态代理来演示AOP拦截器栈的实现。下面我们将深入探讨JDK动态代理及其在AOP中的应用。 首先,我们需要理解JDK动态代理的工作原理。JDK动态代理是Java提供的一种机制,可以在运行时...
Android-Jet-AOP便是一个专为Android平台设计的AOP框架,它借助注解和AspectJ技术,使得在Android应用中实现AOP变得简单易行。 ### 一、面向切面编程(AOP) AOP的核心理念是将程序中的关注点分离,关注点可以理解...
在Spring AOP中,切面可以由Advisor(通知+切入点)或者拦截器实现。 - **通知**(Advice):定义了切面如何改变程序行为的信息,它是在特定连接点上执行的动作。 - **切入点**(Pointcut):定义了何时何处执行通知...
在这个"ssm_拦截器demo"中,我们可以看到一个基于SSM的简单项目配置,以及一个自定义拦截器的实现,这是学习SSM框架和理解拦截器机制的好材料。 首先,我们来看看SSM框架的基础。Spring是整个项目的基石,它提供了...
Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加或删除功能。拦截器是可插拔的,可以在请求到达Action之前或之后执行...
在调用目标方法之前,遍历拦截器链并执行相应的切面逻辑。 ```java // 自定义切面注解 @Retention(RetentionPolicy.RUNTIME) @interface BeforeAdvice {} // 拦截器接口 interface Advice { void execute(); } /...
例如,一个简单的登录拦截器可能会检查用户是否已登录,如果没有,则重定向到登录页面。另一个例子是,一个性能监控拦截器可以在Action开始前记录时间戳,在Action执行后计算并记录执行时间。 在"struts0601"这个...
Struts2的拦截器是一种AOP(面向切面编程)的概念,它在Action调用前后执行特定的逻辑,如日志记录、权限验证、数据校验等。拦截器通过配置在struts.xml或struts-plugin.xml文件中,按照定义的顺序进行调用。每个...
拦截器在Action调用前后执行,形成一个拦截链。当一个请求到达时,Struts框架会按照配置的顺序依次调用这些拦截器,然后执行Action,最后再按逆序返回。通过这种方式,我们可以添加如日志、权限验证、事务管理等通用...
通常是在`web.xml`中配置前端控制器DispatcherServlet,然后在`DispatcherServlet`的配置文件(如`servlet-context.xml`)中定义拦截器链: ```xml <!-- 配置Spring MVC --> xmlns:xsi=...
拦截器是AOP(面向切面编程)的一种表现形式,它可以在方法调用前后执行特定的操作,如日志记录、权限检查、性能统计等。在Spring MVC中,拦截器可以拦截HTTP请求,进一步增强我们的应用程序功能。 要创建一个...
在Struts2中,拦截器是基于责任链模式实现的,多个拦截器可以形成一个拦截器栈,按顺序执行。 要创建自定义拦截器,我们需要遵循以下步骤: 1. **定义拦截器类**:创建一个实现`Interceptor`接口或者继承`...
例如,我们可以创建一个简单的登录拦截器: ```java public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse...
Struts拦截器...`LoginInterceptor.java`作为示例,展示了如何实现一个简单的登录拦截器,确保只有已登录的用户才能访问特定的资源。理解并熟练运用这些概念,可以帮助开发者构建更加健壮和安全的Web应用。
在Struts2中,拦截器是基于Java的动态代理实现的,它遵循责任链模式,允许一系列拦截器按照预定义的顺序执行。 2. **拦截器的生命周期** - **初始化**:当Struts2启动时,配置的拦截器会按声明顺序被创建。 - **...