spring AspectJ AOP

1、开启对spring AspectJ风格切面的支持

2、扫描注解的bean

3、声明切面@Aspect

4、声明切入点@Pointcut(value="",argNames="")

5、声明通知@Before @After @AfterReturning @AfterThrowing @Around

@Before 前置通知 目标方法运行前织入

@After 后置通知 目标方法后织入

@AfterReturning 后置返回通知 目标方法返回后织入

@AfterThrowing 后置异常通知 目标方法抛出异常后织入

@Around 环绕通知 目标方法运行前后及异常抛出后织入

    <!-- 开启Spring对标注了@Aspect注解bean的支持 默认是不支持@AspectJ风格的切面
     统一使用CGLIB代理(spring默认是JDK的动态代理,若没有实现接口则会开启CGLIB)
     使用CGLIB,它有一个使用限制,即无法在使用final修饰的bean上应用横切关注点
     因为代理需要对Java类进行继承,一旦使用了关键字final,这将是无法做到的-->
    <aop:aspectj-autoproxy proxy-target-class="true" />
    <!-- 自动扫描注解的bean-->
    <context:component-scan base-package="com.xxx.xxx">
        <context:include-filter type="annotation" expression="com.alibaba.dubbo.config.annotation.Service" />
        <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect" />
    </context:component-scan>
@Aspect
@Slf4j
public class Aspect {
    /**
     * 声明切入点,此方法无内容,返回类型必须是void
     */
    @Pointcut("execution(* com.xxx.xxx.*.service..*.*(..))")
    public void pointCut() {
    }

    /**
     * 声明环绕通知
     * @param pjp   连接点 通过连接点实例来获得方法执行的上下文信息
     * @return
     * @throws Throwable
     */
    @Around(value = "pointCut()")
    public Object transferException(ProceedingJoinPoint pjp) throws Throwable {
        // 方法返回值
        Class<?> methodReturnType = ((MethodSignature) pjp.getSignature()).getMethod().getReturnType();
        Object result = null;
        try {
            result = pjp.proceed();//Proceed with the next advice or target method invocation
        }
        catch (Exception e) {
            log.error("exception  occurred..............");
            if (methodReturnType.isAssignableFrom(Response.class)) {
                String errorCode = null;
                String errorMsg = null;
                if (e instanceof ApplicationException) {
                    errorCode = ((ApplicationException) e).getCode();
                    errorMsg = ((ApplicationException) e).getErrorMessage();
                }
                else {
                    errorCode = BussErrorCode.ERROR_CODE_999999.getErrorcode();
                    errorCode = BussErrorCode.ERROR_CODE_999999.getErrordesc();
                }
                result = new Response<Object>(errorCode, errorMsg);
            }
        }
        return result;
    }
}

时间: 2024-10-12 21:19:05

spring AspectJ AOP的相关文章

Spring的AOP AspectJ切入点语法详解(转)

一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: execution:用于匹配方法执行的连接点: within:用于匹配指定类型内的方法执行: this:用于匹配当前AOP代理对象类型的执行方法:注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配: target:用于匹配当前目标对象类型的执行方法:注意是目标对象的类型匹配,

Spring @AspectJ 实现AOP 入门例子(转)

AOP的作用这里就不再作说明了,下面开始讲解一个很简单的入门级例子. 引用一个猴子偷桃,守护者守护果园抓住猴子的小情节. 1.猴子偷桃类(普通类): Java代码   package com.samter.common; /** * 猴子 * @author Administrator * */ public class Monkey { public void stealPeaches(String name){ System.out.println("[猴子]"+name+&quo

Spring的AOP基于AspectJ的注解方式开发3

上上偏博客介绍了@Aspect,@Before 上篇博客介绍了spring的AOP开发的注解通知类型:@Before,@AfterThrowing,@After,@AfterReturning,@Around 也介绍了JoinPoint和ProceedingJoinPoint的区别 这篇博客讲@PointCut的使用,切入点注解----转载自https://www.cnblogs.com/ltfxy/p/9885742.html 这种方法便于维护管理 /** * 切面类:注解的切面类 */ @A

8 -- 深入使用Spring -- 4... Spring的AOP

8.4 Spring的AOP AOP(Aspect Orient Programming),也就是面向切面编程,最为面向对象编程的一种补充. AOP和OOP互为补充,面向对象编程将程序分解成各个层次的对象,而面向切面编程将程序运行过程分解成各个切面.可以这样理解:面向对象编程是从静态角度考虑程序结构,而面向切面编程则是从动态角度考虑程序运行过程. 8.4.1 为什么需要AOP 8.4.2 使用AspectJ实现AOP 1.下载和安装AspectJ 2.AspectJ使用入门 8.4.3 AOP的

Spring实现AOP的4种方式(转)

转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的

Spring实现AOP的4种方式

来自:http://blog.csdn.net/udbnny/article/details/5870076 先了解AOP的相关术语: 1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,S

spring的AOP个人理解和使用

1什么是AOP:AOP是面向切面编程,也就是说面向某个功能模块编程,典型的应用就是Spring的声明式事务, Spring的AOP事务解析: 在以前的事务管理是要融合在逻辑代码中的,在逻辑代码中决定事务是否提交或者回滚,这样很容易造成代码难以维护,代码冗余 但是使用spring的声明式事务后,只需要在数据库处理方法上注解事务,就可以对操作进行管理,事务的设置和逻辑代码分开,容易维护2AOP有什么作用 :面向切面编程,例如某个功能点,我们只需抽取横切关注点,然后让需要处理这些功能点的方法来使用代理

Spring框架第五篇之Spring与AOP

一.AOP概述 AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程. AOP底层就是采用动态代理模式实现的,采用了两种代理:JDK的动态代理与CGLIB的动态代理. 面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中.所谓交叉业务逻辑是指,通用的.与主业务逻辑无关的代码.如安全检查.事务.日志等. 若不是用AOP,则会出

Spring的AOP详解

Spring的AOP详解 一.AOP基础 1.1AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢? 传统解决方案 1.日志部分定义公共类LogUtils,定义logPayBegin方法用于记录支付开始日志, logPayEnd用于记录支付结果 logPayBegin(long userId,long money) logPay