`
xiaoyaoke08
  • 浏览: 100030 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring AOP 拦截器

阅读更多

最近由于一个项目需要对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 AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...

    详解Spring AOP 拦截器的基本实现

    具体到Spring AOP拦截器的代码实现,本文通过创建TestInterceptor类来演示。这个类继承自HandlerInterceptorAdapter,然后重写其中的afterCompletion、postHandle等方法。在这个类中,可以在相应方法中添加自定义的...

    springboot spring aop 拦截器注解方式实现脱敏

    这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...

    spring aop 拦截器简单实现

    本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...

    spring aop 拦截实例

    在提供的压缩包中,可能包含了一个或多个测试类(Tests),这些测试类通常用来验证AOP拦截器的功能。它们可能包含模拟业务场景的方法,这些方法会被切面拦截并执行相应的通知。通过运行这些测试,我们可以确保AOP...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...

    spring AOP拦截方法小示例

    这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...

    Spring使用AOP的三个jar包

    它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架(如Spring和AspectJ)可以共享相同的拦截器(interceptors)。...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    接下来,描述中提到了"MethodInterceptor",这是Spring AOP中的一种拦截器,用于拦截并修改代理对象的方法调用。不同于HandlerInterceptor,MethodInterceptor是基于代理的AOP,适用于拦截任何由Spring管理的对象,...

    spring aop 拦截日志示例

    在Spring AOP(面向切面编程)中,我们可以通过定义拦截器来实现对系统操作日志和异常日志的记录,这些日志信息通常会被存储到数据库中以便于后续的分析和故障排查。下面将详细介绍如何使用Spring AOP实现这个功能。...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring AOP四种创建通知(拦截器)类型

    ### Spring AOP 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...

    Spring aop 性能监控器

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...

    Spring拦截器,高级参数绑定

    Spring MVC中的拦截器是基于AOP(面向切面编程)原理实现的,可以理解为对Controller方法调用的预处理和后处理。下面将详细探讨Spring拦截器的使用以及高级参数绑定和Controller返回值的相关知识。 首先,我们创建...

    spring AOP依赖三个jar包

    Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    - **Interceptor(拦截器)**:一个实现了特定接口的类,用来包装目标方法并执行额外的动作。 - **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **...

    spring aop用到jar包.rar

    除此之外,Spring AOP的使用可能还需要其他相关库,比如`aspectjrt.jar`和`aspectjweaver.jar`,这两个是AspectJ运行时库和编织器,用于在运行时或编译时将切面织入到目标类中。如果涉及到XML配置,`spring-...

    spring aop demo 两种实现方式

    在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即拦截器。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...

Global site tag (gtag.js) - Google Analytics