栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

AOP切面编程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AOP切面编程

一.第一种写法

1.先定义一个类

package com.spring.aop;

public class Service {

    public void m1() {
        System.out.println("我是 m1 方法");
    }

    public void m2() {
        System.out.println(1 / 0);
        System.out.println("我是 m2 方法");
    }
}

2.定义一个切面类(第一种)

package com.javacode2018.aop.demo9.test1;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//这个类需要使用@Aspect进行标注,标注该类为切面类
@Aspect
public class Aspect {

    //定义了一个切入点,可以匹配Service中所有方法
    @Pointcut("execution(* com.spring.aop.Service.*(..))")
    public void pointcut() {

    }

    //定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @Before(pointcut = "pointcut1()")
    public void before(JoinPoint joinPoint) {
        //输出连接点的信息
        System.out.println("前置通知," + joinPoint);
    }

    //定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @AfterThrowing(pointcut = "pointcut1()", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Exception e) {
        //发生异常之后输出异常信息
        System.out.println(joinPoint + ",发生异常:" + e.getMessage());
    }

}

二.第二种写法

1.先写注解接口。

package com.javacode2018.cache.ReloadCache
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Authorize {

    
    String functionCode();
}

2.定义一个类

package com.spring.aop;

public class Service {

    @RelodCache//这里标注自定义注解
    public void m1() {
        System.out.println("我是 m1 方法");
    }
}

3.编写切面类

package com.javacode2018.aop.demo9.test1;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//这个类需要使用@Aspect进行标注,标注该类为切面类
@Aspect
public class Aspect {

    //定义了一个切入点,匹配所有标注ReloadCache注解的方法
    @Pointcut("@annotation(com.javacode2018.cache.ReloadCache)")
    public void pointcut() {

    }

    //定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @Before(pointcut = "pointcut1()")
    public void before(JoinPoint joinPoint) {
        //输出连接点的信息
        System.out.println("前置通知," + joinPoint);
    }

    //定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @AfterThrowing(pointcut = "pointcut1()", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Exception e) {
        //发生异常之后输出异常信息
        System.out.println(joinPoint + ",发生异常:" + e.getMessage());
    }

}

三.注:通知有五种,这里只举例两种通知,还有

       后置通知:@AfterReturn,在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行

       最终通知:@After,在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会                              执行返回通知中的内容

        环绕通知:@Around,环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大                             的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继                             续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

四.JoinPoint对象:封装了SpringAop中切面方法的信息

   常用api:

方法名功能
Signature getSignature();获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs();获取传入目标方法的参数对象
Object getTarget();获取被代理的对象
Object getThis();获取代理对象
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/841977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号