本例子Spring 实现拦截器
依赖的jar包有 aopalliance.jar cglib-full-2.0.2.jar commons-logging.jar spring.jar
Spring的AOP声明式事务管理。
1. 几个重要的概念
PointCut:一组JointPoint。在Spring中我们可以通过一些正则表达式定义那些JointPoint组成了我们需要的一个PointCut,从而使我们的Advice可以被编制进来。
Introduction:Introduction可以我们在已经存在的类中在不修改这个类的情况下增加属性和方法,从而增加其状态和动作;
Target:满足PointCut定义的条件的一个类,我们可以把Advice用于这个类。大多Spring的AOP是通过动态代理的机制实现的,这个Target就是那个被代理的对象;
Proxy:为了将一个Advice应用到另外一个类中,比如实现Around
Advice,就是在一个方法执行前后加上其他的代码,那么实际的实现一定是先执行一段Advice的代码,然后执行Target的那个方法,之后再执行
一段Advice的代码,也就是客户端执行某个类的时候,实际执行的是一个代理,由代理再把调用传递到那个Target中。
Weaving(编织):有了Target和Advice,在什么时机将这两个模块编织在一起呢?可以选择的方法包括编译的时候(这样我们需要一个特
殊的编译器),装载类的时候(这样我们需要一个特殊的ClassLoader)和运行的时候(AOP容易可以动态的创建一个代理从而将调用由这个代理传递
到Target类中)。
2. Throws Advice
项目中有一个要求,对于某些处理流程如果在运行的时候抛出了一些异常,需要将这些异常的信息记录下来,保存在数据库或发邮件给开发人员。
按照上面概念的描述,我们应该主要注意三个概念:Target,Advice和Proxy。
配置文件
<project name="MyProject" default="compile" basedir=".">
<property name="sourcedir" value="${basedir}/src"/>
<property name="targetdir" value="${basedir}/build"/>
<property name="librarydir" value="${basedir}/lib"/>
<path id="libraries">
<fileset dir="${librarydir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean">
<delete dir="${targetdir}"/>
<mkdir dir="${targetdir}"/>
</target>
<target name="compile" depends="copy-resources">
<javac srcdir="${sourcedir}"
destdir="${targetdir}"
classpathref="libraries"/>
</target>
<target name="copy-resources">
<copy todir="${targetdir}">
<fileset dir="${sourcedir}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="run" depends="clean, compile">
<java classname="SimpleThrowsAdvice" fork="true" classpathref="libraries">
<classpath path="${targetdir}"/>
</java>
</target>
</project>
ErrorBean.java
public class ErrorBean {
public void errorProneMethod() throws Exception {
throw new Exception("Foo");
}
public void otherErrorProneMethod() throws IllegalArgumentException {
throw new IllegalArgumentException("Bar");
}
}
SimpleThrowsAdvic.java
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.aop.framework.ProxyFactory;
public class SimpleThrowsAdvice implements ThrowsAdvice {
public static void main(String[] args) throws Exception {
ErrorBean errorBean = new ErrorBean();
ProxyFactory pf = new ProxyFactory();
pf.setTarget(errorBean);
pf.addAdvice(new SimpleThrowsAdvice());
ErrorBean proxy = (ErrorBean) pf.getProxy();
try {
proxy.errorProneMethod();
} catch (Exception ignored) {
}
try {
proxy.otherErrorProneMethod();
} catch (Exception ignored) {
}
}
public void afterThrowing(Exception ex) throws Throwable {
System.out.println("***");
System.out.println("Generic Exception Capture");
System.out.println("Caught: " + ex.getClass().getName());
System.out.println("***\n");
}
public void afterThrowing(Method method, Object[] args, Object target,
IllegalArgumentException ex) throws Throwable {
System.out.println("***");
System.out.println("IllegalArgumentException Capture");
System.out.println("Caught: " + ex.getClass().getName());
System.out.println("Method: " + method.getName());
System.out.println("***\n");
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何实现Struts2与Spring的集成,以及利用拦截器来增强应用的功能。 首先,Struts2 是一个基于MVC设计模式的开源Web框架,它提供了强大的控制器层,使得开发者可以更方便地处理HTTP请求和...
在`intercept`方法中,我们实现了类似Spring拦截器的功能,调用`preHandle`和`postHandle`方法,并根据`preHandle`的结果决定是否执行目标方法。 最后,`afterCompletion`方法的调用通常需要手动管理,因为它涉及到...
在本案例中,我们将探讨如何使用注解来实现拦截器,用于数据脱敏,这是保护敏感信息的一种常见方法。数据脱敏是指在展示或传输数据时,将敏感信息替换或隐藏,以确保隐私。 首先,让我们从`pom.xml`文件开始。在...
Spring Boot利用Spring MVC的Filter或者Interceptor机制来实现拦截器。这里我们主要关注`HandlerInterceptor`接口,它提供了三个方法: 1. `preHandle(HttpServletRequest request, HttpServletResponse response, ...
总结起来,Spring Boot中的拦截器是增强应用程序功能的重要工具,通过实现或扩展拦截器接口,我们可以灵活地控制请求处理流程,实现自定义逻辑,如权限验证、日志记录等。在实际项目中,正确配置和使用拦截器能够...
Spring MVC中的拦截器是基于AOP(面向切面编程)原理实现的,可以理解为对Controller方法调用的预处理和后处理。下面将详细探讨Spring拦截器的使用以及高级参数绑定和Controller返回值的相关知识。 首先,我们创建...
在Spring Boot中注册拦截器,我们需要在配置类中使用`@EnableAspectJAutoProxy`开启AOP代理,并通过`@Bean`注解声明拦截器实例。然后,使用`@Around`注解定义切点,即拦截所有的JPA操作。 在实际开发中,为了使分库...
### Spring MVC 拦截器:深入理解与实践 #### 一、概念解析 Spring MVC 框架中的拦截器(Interceptor)是一种重要的组件,它主要用于处理请求与响应的生命周期,提供了一种灵活的方式来实现诸如权限检查、日志记录...
拦截器通常通过实现HandlerInterceptor接口来完成拦截逻辑,这个接口提供了三个主要方法:preHandle、postHandle和afterCompletion。 - preHandle方法在请求处理之前进行调用,也就是Controller方法被调用之前。...
在Spring MVC中,我们可以通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类来创建自定义拦截器。拦截器的主要方法包括preHandle、postHandle和afterCompletion,分别在请求处理前、处理后以及...
Spring Boot提供了对Spring MVC的集成,因此我们可以利用Spring MVC的拦截器机制来实现这些功能。 首先,让我们了解一下Spring Boot中创建拦截器的基本步骤: 1. 创建自定义拦截器类:你需要创建一个实现了`...
Flex-Spring 拦截器是 Spring 框架与 Adobe Flex 之间的集成关键部分,它允许在服务调用之间添加拦截逻辑,从而实现如事务管理、权限验证、日志记录等功能。这篇博客(https://rogerhunt.iteye.com/blog/608778)...
而Spring拦截器则是实现AOP的一种方式,它类似于Java的Servlet过滤器,可以在方法调用前后执行自定义的操作。 AOP拦截器在Spring中主要通过`HandlerInterceptor`接口或者`@AspectJ`注解来实现。下面我们将详细探讨...
在本次的“spring MVC(新增拦截器demo)”项目中,我们将重点探讨如何在Spring MVC中添加拦截器来实现对请求的预处理和后处理。 拦截器在Spring MVC中扮演着关键的角色,它们可以用来执行一些全局性的任务,如日志...
Spring 拦截器是 Spring 框架中一个非常重要的组件,主要用于处理请求和响应,实现业务逻辑之前和之后的预处理和后处理。它为开发者提供了在 MVC 模式下实现统一处理机制的机会,比如权限验证、日志记录、性能监控等...
这通常通过将拦截器类声明为Spring Bean来实现。 5. **定义切点表达式**:切点表达式使用特殊的语法(如`execution(* com.example.service.*.*(..))`)来指定需要拦截的方法。这里的星号表示通配符,`...
本教程将详细介绍如何使用Spring MVC的拦截器来实现这一功能。 首先,了解拦截器(Interceptor)在Spring MVC中的角色。拦截器是Spring MVC提供的一种AOP(面向切面编程)特性,允许我们在请求处理之前、之后或者在...
在Spring MVC中,拦截器是通过实现`HandlerInterceptor`接口或继承`AbstractHandlerInterceptor`抽象类来创建的。主要涉及三个方法: 1. `preHandle(HttpServletRequest request, HttpServletResponse response, ...
本篇文章将详细探讨如何在Spring Boot中添加和使用拦截器来实现登录拦截。 首先,我们需要了解Spring Boot中的拦截器是如何工作的。在Spring MVC框架中,拦截器是基于AOP(面向切面编程)的概念实现的。我们可以...
在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口或继承`AbstractHandlerInterceptorAdapter`类来创建自定义拦截器。拦截器通常用于权限验证、日志记录、性能监控等场景。在这个案例中,我们可以创建一个...