最近由于一个项目需要对service层中的所有方法运行的情况(方法名、运行时间)和抛出的异常做一个拦截,所以趁机会对Spring的拦截器了解了下
拦截器的两个概念
Advice:通知,用于告知系统将有哪些新的行为。
Pointcut: 切入点,定义了通知应该在应用到那些连接点
演示实例
首先来看一个例子,(以下代码copy下来可以运行)
本实例主要实现程序对service层方法调用的时候,记录每个方法所花费的时间和抛出的异常。
1、所需引入的jar包括:
spring-2.5.6.jar
cglib-2.2.jar
commons-logging-1.1.1.jar
aspectjweaver-1.6.0.jar
2、编写业务逻辑代码
HelloService.java
package com.aop.demo.service;
public interface HelloService {
public void sayHello(String name) throws Exception;
}
HelloServiceImpl.java
package com.aop.demo.service.impl;
import com.aop.demo.service.HelloService;
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello(String name) throws Exception {
//如果name为空,抛出异常
if(name == null || "".equals(name.trim())){
throw new Exception("name can't be empty !");
}
System.out.println("hello "+name+" !");
}
}
LogicService.java
package com.aop.demo.service;
public interface LogicService {
public void doLogic() throws Exception;
}
LogicServiceImpl.java
package com.aop.demo.service.impl;
import com.aop.demo.service.LogicService;
public class LogicServiceImpl implements LogicService {
@Override
public void doLogic() throws Exception {
//sleep 3s
Thread.sleep(3000);
System.out.println("this is logic .");
}
}
3、编写通知
MethodBeforeAdvice,前置通知,该接口有一个唯一的方法before,在执行目标方法之前被调用
AfterReturningAdvice,后置通知,该接口有一个唯一的方法after,在执行完目标方法之后被调用
ThrowsAdvice,异常通知,实现afterThrowing,在目标方法抛出异常之后被调用
MethodInterceptor,环绕通知,在一个方法执行之前和之后执行。 它使得通知有机会既在一个方法执行之前又在执行之后运行。并且,它可以决定这个方法在什么时候执行,如何执行,甚至是否执行。
MethodAroundAdvice.java
package com.aop.demo.advice;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
public class MethodAroundAdvice implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{
private long beforeRunTime;
private long afterRunTime;
//service方法执行之前被调用
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
//记录当前时间
beforeRunTime = System.currentTimeMillis();
}
// service方法执行完之后被调用
@Override
public void afterReturning(Object arg0, Method method, Object[] args,
Object target) throws Throwable {
//记录当前时间
afterRunTime = System.currentTimeMillis();
//取得该方法运行所消耗的时间
long durationTimes = afterRunTime - beforeRunTime;
//类名
String clazzName = target.getClass().getName();
//方法名
String methodName = method.getName();
System.out.println(clazzName+"."+methodName+" end running and spend
times is "+durationTimes);
}
//抛出Exception之后被调用
public void afterThrowing(Method method, Object[] args, Object target,Exception ex) throws Throwable {
String clazzName = target.getClass().getName();
String methodName = method.getName();
String exceptionClazz = ex.getClass().getName();
String exceptionMessage = ex.getMessage();
System.err.println(clazzName+"."+methodName+" have a error cause by: \n"+exceptionClazz+", "+exceptionMessage);
}
}
配置xml文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
default-autowire="byName">
<aop:config>
<aop:advisor id="methodAroundAdviceAdvisor" advice-ref="methodAroundAdvice" pointcut="execution(* *..service.*Service.*(..))" />
</aop:config>
<!—通知类 -->
<bean id="methodAroundAdvice" class="com.aop.demo.advice.MethodAroundAdvice"/>
<!-- 业务Bean -->
<bean id="logicService" class="com.aop.demo.service.impl.LogicServiceImpl" />
<bean id="helloService" class="com.aop.demo.service.impl.HelloServiceImpl" />
</beans>
编写测试类
Test.java
package com.aop.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.aop.demo.service.HelloService;
import com.aop.demo.service.LogicService;
public class Test {
public static void main(String[] args) {
String config_xml = ".\\src\\applicationContext.xml";
ApplicationContext ac = new FileSystemXmlApplicationContext(config_xml);
try {
LogicService logicService = (LogicService) ac.getBean("logicService");
logicService.doLogic();
//HelloService helloService = (HelloService) ac.getBean("helloService");
//helloService.sayHello("");
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...
具体到Spring AOP拦截器的代码实现,本文通过创建TestInterceptor类来演示。这个类继承自HandlerInterceptorAdapter,然后重写其中的afterCompletion、postHandle等方法。在这个类中,可以在相应方法中添加自定义的...
这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...
本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...
在提供的压缩包中,可能包含了一个或多个测试类(Tests),这些测试类通常用来验证AOP拦截器的功能。它们可能包含模拟业务场景的方法,这些方法会被切面拦截并执行相应的通知。通过运行这些测试,我们可以确保AOP...
例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...
这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...
它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架(如Spring和AspectJ)可以共享相同的拦截器(interceptors)。...
接下来,描述中提到了"MethodInterceptor",这是Spring AOP中的一种拦截器,用于拦截并修改代理对象的方法调用。不同于HandlerInterceptor,MethodInterceptor是基于代理的AOP,适用于拦截任何由Spring管理的对象,...
在Spring AOP(面向切面编程)中,我们可以通过定义拦截器来实现对系统操作日志和异常日志的记录,这些日志信息通常会被存储到数据库中以便于后续的分析和故障排查。下面将详细介绍如何使用Spring AOP实现这个功能。...
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
### Spring AOP 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...
在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...
Spring MVC中的拦截器是基于AOP(面向切面编程)原理实现的,可以理解为对Controller方法调用的预处理和后处理。下面将详细探讨Spring拦截器的使用以及高级参数绑定和Controller返回值的相关知识。 首先,我们创建...
Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...
在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...
- **Interceptor(拦截器)**:一个实现了特定接口的类,用来包装目标方法并执行额外的动作。 - **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **...
除此之外,Spring AOP的使用可能还需要其他相关库,比如`aspectjrt.jar`和`aspectjweaver.jar`,这两个是AspectJ运行时库和编织器,用于在运行时或编译时将切面织入到目标类中。如果涉及到XML配置,`spring-...
在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即拦截器。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...