关于Aop切面中的@Before @Around等操作顺序的说明

【转】http://www.cnblogs.com/softidea/p/6123307.html

话不多说,直接上代码:

package com.cdms.aop.aspectImpl;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 创建 by 草帽boy on 2017/4/1.
 */
@Aspect
@Component
public class ICacheAopAction {
    @Pointcut("@annotation(com.cdms.aop.ICache)")
    private void controllerAspect(){}

    @Before("controllerAspect()")
    public void Before(JoinPoint joinPoint){
        String classname = joinPoint.getTarget().getClass().getSimpleName();
        String methodName = joinPoint.getSignature().getName();
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        System.out.println("@before Execute! --class name: " + classname + ", method name: " + methodName + " " + args );
    }

    @Around("controllerAspect()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("@Around:执行目标方法之前...");
        Object obj= proceedingJoinPoint.proceed();
        System.out.println("@Around:执行目标方法之后...");
        System.out.println("@Around:被织入的目标对象为:" + proceedingJoinPoint.getTarget());
        System.out.println( "@Around:原返回值:" + obj + ",这是返回结果的后缀");
        return obj;
    }

    @AfterThrowing("controllerAspect()")
    public void AfterThrowing(){
        System.out.println("异常通知....");
    }

    @After("controllerAspect()")
    public void After(JoinPoint point){
        System.out.println("@After:模拟释放资源...");
        System.out.println("@After:目标方法为:" +
                point.getSignature().getDeclaringTypeName() +
                "." + point.getSignature().getName());
        System.out.println("@After:参数为:" + Arrays.toString(point.getArgs()));
        System.out.println("@After:被织入的目标对象为:" + point.getTarget());
    }

    @AfterReturning("controllerAspect()")
    public void AfterReturning(JoinPoint point){
        System.out.println("@AfterReturning:模拟日志记录功能...");
        System.out.println("@AfterReturning:目标方法为:" +
                point.getSignature().getDeclaringTypeName() +
                "." + point.getSignature().getName());
        System.out.println("@AfterReturning:参数为:" +
                Arrays.toString(point.getArgs()));
        System.out.println("@AfterReturning:返回值为:" );
        System.out.println("@AfterReturning:被织入的目标对象为:" + point.getTarget());
    }

}

测试的结果是:

这样就很清楚的看出各种方法是在什么时候调用的啦

时间: 2024-12-11 10:23:15

关于Aop切面中的@Before @Around等操作顺序的说明的相关文章

Spring AOP——Spring 中面向切面编程

前面两篇文章记录了 Spring IOC 的相关知识,本文记录 Spring 中的另一特性 AOP 相关知识. 部分参考资料: <Spring实战(第4版)> <轻量级 JavaEE 企业应用实战(第四版)> Spring 官方文档 W3CSchool Spring教程 易百教程 Spring教程 一.AOP--另一种编程思想 1.1 什么是 AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程.AOP 是一种编程思想,是面向对象编程(

对AOP切面的一些整理与理解

  首先上一张AOP的图示 一:几个重要的概念   1> 切面:横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象[验证切面.日志切面]   2> 通知:切面中的每个方法   3> 目标:被通知的方法(业务逻辑中的方法)   4> 代理(proxy):向目标对象应用通知之后创建的对象   5> 连接点:程序运行前的某个特定位置(详细的物理存在):如某个方法调用前,调用后,方法抛出异常后等. 连接点由两个信息确定:方法表示的程序运行点相对点表示的方位.   6>

spring AOP切面日志 拦截方法中有同名方法问题

代码: @ResponseBody @RequestMapping("/login.do") public Json login(SysUserPM sysUserPM, HttpSession session) { Json j = new Json(); SysUserPM sysUser = sysUserServiceI.doLogin(sysUserPM); if (sysUser != null) { System.out.println("后台用户登录成功!&q

使用Spring AOP切面解决数据库读写分离

http://blog.jobbole.com/103496/ 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取.如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击. 解决读写分离的方案很多,常用的有SQL解析.动态设置数据源.SQL解析主要是通过分析sql语句是insert/select/update/delete中的哪

AOP基础知识及AOP切面编程之注释方法、xml配置方法

<span style="font-family: 微软雅黑; font-size: 10.5pt; letter-spacing: 0pt; ">AOP概念</span> Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象 joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,这些点是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器

Spring Aop 切面编程

需求:之前的动态选择数据库,和现在的将某个service层的方法接入cat,都需要用到切面编程. 参考文献: http://www.blogjava.net/supercrsky/articles/174368.html http://my.oschina.net/itblog/blog/211693 一.简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足. 除了类(classes)以外,AOP提供了 切面.切面对关注点进行模块化,例如横切

AOP切面编程

AOP的实现底层实际上即为反射,JDK中的反射类java.lang.reflect.Proxy是Java中唯一可以访问调度器的类.类似地,常见的动态代理库cglib也是通过反射机制实现了动态代理的封装.技术成熟度相对较高的AspectJ和Spring AOP会在底层实现一套reflect机制,区别是两者对规范实现如何定义而已. 无论是AspectJ还是Spring AOP,所有这些AOP编程都是基于反射和运行时的动态代理控制实现的.下面通过Proxy和Cglib来实现自己的动态代理切面. 假设我

Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特别长.知道了问题之后,就需要对查询比较慢的接口进行优化,但哪些接口需要优化.哪些不需要呢?只能通过日志里的执行时间来判断,那么如何才能知道每一个接口的执行时间呢? 如果想学习Java工程化.高性能及分布式.深入浅出.微服务.Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级

SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部