`

aop 通知类型

 
阅读更多

一、声明一个切面类

1、首先要将这个类放入容器中,基于注解,在类头信息加入@Component

2、将这个类声明成切面类,在头信息加入@Aspect注解

3、可以基于切面中的方法,比如前置通知,后置通知,返回通知,异常通知,以及环绕通知写自己的业务逻辑,定义切点"execution(* com.liyi.service.*.*(..))",即那些方法需要执行这些方法。如果想获取到方法的名字和参数,可以在方法中加入JoinPoint参数,可以获取到进入切面的方法细节。

    3.1 前置通知:执行目标方法前拦截到的方法。没有特殊注意的地方,只需要一个连接点,JoinPoint,即可获取拦截目标方             法以及请求参数。

    3.2 后置通知: 切面的后置通知,不管方法是否抛出异常,都会走这个方法。只需要一个连接点,JoinPoint,即可获取当               前结束的方法名称。

    3.3 返回通知:  在方法正常执行通过之后执行的通知叫做返回通知。此时注意,不仅仅使用JoinPoint获取连接                          点信息,同时要在返回通知注解里写入,resut="result"。在切面方法参数中加入Object result,用于接受返回通知              的返回结果。如果目标方法方法是void返回类型则返回NULL

    3.4 异常通知: 在执行目标方法过程中,如果方法抛出异常则会走此方法。和返回通知很相似,在注解中                                  加入,throwing="ex",在切面方法中加入Exection ex用于接受异常信息

    3.5 环绕通知:环绕通知需要携带ProceedingJoinPoint 这个类型的参数,环绕通知类似于动态代理的全过程                              ProceedingJoinPoint类型的参数可以决定是否执行目标函数环绕通知必须有返回值。其实就是包含了所有通知的全              过程

四、最后别忘了在applicationContent.xml中声明aspect的代理对象,即初始化spring 容器的时候,spring自动对切点生成代理对象

<!-- 配置aspect 自动为匹配的类 产生代理对象 -->
<aop:aspectj-autoproxy>


Ⅱ 接下来 直接粘贴代码,很直观。

@Component
@Aspect
public class LoggingAspect {
    /**
     * 切面的前置方法 即方法执行前拦截到的方法 记录并输出
     * 在目标方法执行之前的通知
     * @param joinPoint
     */
     
    @Before("execution(* com.liyi.service.*.*(..))")//第一个星号是否方法的返回值 第二个星是只service的所有子包 另一个是任意方法
    public void beforeMethod(JoinPoint joinPoint){
        System.out.println("======================方法开始======================");
        Object object = joinPoint.getSignature();
        String methodName = joinPoint.getSignature().getName();
        List<Object> list = Arrays.asList(joinPoint.getArgs());
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String rightnow=sdf.format(date);
        System.out.println(rightnow+"执行了【"+object+"方法开始执行......】"); 
        System.out.println("******参数"+list+"******");
    }
    /**
     * 切面的后置方法,不管抛不抛异常都会走此方法
     * 在目标方法执行之后的通知
     * @param joinPoint
     */
    @After("execution(* com.liyi.service.*.*(..))")
    public void afterMethod(JoinPoint joinPoint){
        Object object = joinPoint.getSignature();
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String rightnow=sdf.format(date);
        System.out.println(rightnow+"执行了【"+object+"方法结束......】"); 
    }
     
    /**
     * 在方法正常执行通过之后执行的通知叫做返回通知
     * 可以返回到方法的返回值 在注解后加入returning
     * @param joinPoint
     */
    @AfterReturning(value="execution(* com.liyi.service.*.*(..))",returning="result")
    public void afterReturn(JoinPoint joinPoint,Object result ){
        Object object = joinPoint.getSignature();
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String rightnow=sdf.format(date);
        System.out.println(rightnow+"执行了【"+object+"方法正常执行结束......】"+"【返回结果:"+result+"】"); 
        System.out.println("√√√√√√√√√√√√√√√√√√√√√√方法结束√√√√√√√√√√√√√√√√√√√√√√");
    }
     
    /**
     * 在目标方法非正常执行完成 发生异常 抛出异常的时候会走此方法
     * 获得异常可以用throwing
     * @param joinPoint
     * @param ex
     */
    @AfterThrowing(value="execution(* com.liyi.service.*.*(..))",throwing="ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex ){
        Object object = joinPoint.getSignature();
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String rightnow=sdf.format(date);
        System.out.println(rightnow+"执行了【"+object+"方法发生异常......】"+"【异常报告:"+ex+"】"); 
        System.out.println("xxxxxxxxxxxxxxxxxx方法发生异常结束xxxxxxxxxxxxxxxxxx");
    }
    /**
     * 环绕通知需要携带ProceedingJoinPoint 这个类型的参数
     * 环绕通知类似于动态代理的全过程 ProceedingJoinPoint类型的参数可以决定是否执行目标函数
     * 环绕通知必须有返回值
     * @param proceedingJoinPoint
     * @return
     */
//    @Around(value="execution(* com.liyi.service.*.*(..))")
//    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint){
//        Object result=null;
//        Object classMethod=proceedingJoinPoint.getSignature();
//        Date date = new Date();
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//        String rightnow=sdf.format(date);
//        try {
//            //前置通知
//            System.out.println(rightnow+"环绕通知执行了【"+classMethod+"方法开始执行......】"); 
//            //执行目标方法
//            result = proceedingJoinPoint.proceed(); 
//            //返回通知
//            System.out.println(rightnow+"环绕通知正常执行【"+classMethod+"方法完毕......】"+"【返回结果:】"+result);
//        } catch (Throwable e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//            //异常通知
//            System.out.println(rightnow+"环绕通知非正常执行【"+classMethod+"方法完毕,抛出异常......】"+"【返回异常:】"+e);
//        }
//            //后置通知
//        System.out.println(rightnow+"环绕通知执行【"+classMethod+"方法完毕】");
//        return result;
//    }
}

最后说明一点:所有通知类型都能获取到方法的相关参数,只有返回通知和环绕通能得到切面方法的返回值
分享到:
评论

相关推荐

    Xml文件配置实现AOP通知

    **AOP通知类型** AOP通知是指在特定连接点(Join Point)执行的动作,Spring支持五种不同的通知类型: 1. **前置通知(Before Advice)**: 在目标方法执行之前运行。 2. **后置通知(After Advice)**: 在目标方法...

    aop的详细总结(包含例子)

    四、Spring AOP通知类型 1. BeforeAdvice:在目标方法执行前运行,可以修改参数或抛出异常阻止方法执行。 2. AfterreturningAdvice:在方法成功返回后运行,无法修改返回值,但可抛出异常阻止方法运行。 3. ...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    四、Spring AOP通知类型 1. BeforeAdvice(前置通知):在方法执行前调用,可以修改参数,抛出异常阻止方法执行。 2. AfterreturningAdvice(后返回通知):在方法正常返回后调用,不能修改返回值,但能抛出异常。...

    aop 权限验证demo

    这是最灵活的AOP通知类型,可以在方法执行前后执行自定义逻辑,包括权限验证。 在Spring AOP中,可以使用`@Aspect`注解定义一个切面类,然后使用`@Before`, `@After`, 或 `@Around` 注解定义通知。例如: ```java ...

    spring aop

    springAOP_17-18.rar可能是关于AOP通知类型和切点表达式的深入探讨;而springAOPforXML_19-20.rar可能介绍了如何通过XML配置来实现AOP。通过学习这些内容,你可以更深入地理解并掌握Spring AOP的使用,提升你的应用...

    Spring 4.0 AOP 面向切面Maven测试程序

    1. **AOP通知类型**: - **前置通知(Before Advice)**:在目标方法执行前触发,通常用于执行校验或初始化操作。 - **后置通知(After Advice)**:无论目标方法是否成功执行,都会在方法执行后触发,常用于资源...

    spring的Aop中的前置通知,后置通知以及环绕通知简单代码

    在Spring AOP中,有三种主要的通知类型:前置通知、后置通知和环绕通知。下面将详细解释这三种通知,并通过简单的代码示例进行演示。 **1. 前置通知(Before Advice)** 前置通知在目标方法被调用之前执行,但无法...

    Spring.net通知类型,以及通知链

    在XML配置中,你可以使用`&lt;aop:config&gt;`、`&lt;aop:advisor&gt;`、`&lt;aop:before&gt;`、`&lt;aop:after&gt;`、`&lt;aop:around&gt;`等元素来指定通知类型和关联的切点表达式。 - 基于代码的配置则使用`AopConfigUtils`类和相关的接口,如`...

    SpringAop xml方式配置通知

    - `beforeMethod`, `afterReturningMethod`, `afterThrowingMethod` 和 `aroundMethod`是切面类中定义的通知方法,分别对应四种不同的通知类型。 **三、通知类型** 1. **前置通知(Before Advice)**:在目标方法...

    spring AOP 概念

    #### 四、Spring AOP 通知类型 - **BeforeAdvice**:在方法执行前执行。 - **AfterReturningAdvice**:在方法正常返回后执行。 - **AroundAdvice**:环绕通知,可以在方法调用前后执行自己的逻辑,并且能够控制是否...

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

    除了四种基本的通知类型,Spring AOP还引入了“切入点”和“引入通知”的概念来更精细地控制通知的应用范围。切入点(PointCut)定义了通知应该应用于哪些连接点(JoinPoint),即方法调用。引入通知(Advisor)则将...

    Spring之AOP注解之引入通知

    引入通知是Spring AOP的一种特殊类型的通知,它可以在目标对象上添加新的接口或方法,而无需修改原始类的源代码。这种特性非常实用,尤其是在处理遗留系统或者第三方库时,可以避免对原有代码的侵入性修改。 Spring...

    Spring 使用AspectJ 实现 AOP之前置通知小例子

    标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...

    spring aop spring aop

    在给出的XML配置中,`&lt;aop:config&gt;`元素开启AOP支持,而`&lt;aop:aspect&gt;`元素用于定义切面,其内部通过`&lt;aop:pointcut&gt;`定义切点,并通过`&lt;aop:before&gt;`和`&lt;aop:after&gt;`指定通知。 为了使用这些配置,我们需要在代码...

    spring03-7

    以下是对AOP通知类型的详细说明,以及如何在实际应用中使用它们。 1. **前置通知(Before Advice)**: 前置通知在目标方法被调用之前执行。在Spring AOP中,这通常通过`@Before`注解实现。例如,我们可以创建一个...

    Spring基于ProxyFactoryBean创建AOP代理

    下面将详细介绍 ProxyFactoryBean 的使用方法和 Spring 中的 AOP 通知类型。 Spring 中的 AOP 通知类型 在 Spring 中,AOP 通知类型分为五种:前置通知、后置通知、环绕通知、异常通知和引介通知。 1. 前置通知...

    Spring-AOP(前置/后置/环绕)通知的例子

    Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它...通过理解并熟练掌握Spring AOP的各种通知类型,我们可以更好地实现系统中的横切关注点,使得业务逻辑更加清晰,代码更加简洁。

    spring中AOP中标签加载通知

    首先,我们需要了解Spring AOP中的通知类型: 1. 前置通知(Before Advice):在目标方法被调用之前执行,如`@Before`注解标记的方法。 2. 后置通知(After Returning Advice):在目标方法成功执行后执行,如`@...

    Spring考试试卷(有答案).docx

    9. AOP通知类型:Spring AOP的通知类型包括前置通知、后置通知、环绕通知、返回通知和异常通知,不包括代理通知。 10. Spring与Hibernate集成错误理解:选项C中的描述是错误的,Spring管理依赖关系,注入...

Global site tag (gtag.js) - Google Analytics