使用注解和Java配置类开发AspectJ

AspectJ.java

package aspectj.annotation;

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

/**
 * 切面类,在此类中编写各种类型通知
 */
@Aspect//@Aspect声明一个切面
@Component//@Component让此切面成为Spring容器管理的Bean
public class MyAspect {
    /**
     * 定义切入点,通知增强哪些方法。
     * "execution(* aspectj.dao.*.*(..))" 是定义切入点表达式,
     * 该切入点表达式的意思是匹配aspectj.dao包中任意类的任意方法的执行。
     * 其中execution()是表达式的主体,第一个*表示的是返回类型,使用*代表所有类型;
     * aspectj.dao表示的是需要匹配的包名,后面第二个*表示的是类名,使用*代表匹配包中所有的类;
     * 第三个*表示的是方法名,使用*表示所有方法; 后面(..)表示方法的参数,其中“..”表示任意参数。
     * 另外,注意第一个*与包名之间有一个空格。
     */
    @Pointcut("execution(* aspectj.dao.*.*(..))")
    private void myPointCut() {
    }

    /**
     * 前置通知,使用Joinpoint接口作为参数获得目标对象信息
     */
    @Before("myPointCut()")//myPointCut()是切入点的定义方法
    public void before(JoinPoint jp) {
        System.out.print("前置通知:模拟权限控制");
        System.out.println(",目标类对象:" + jp.getTarget()
                + ",被增强处理的方法:" + jp.getSignature().getName());
    }

    /**
     * 后置返回通知
     */
    @AfterReturning("myPointCut()")
    public void afterReturning(JoinPoint jp) {
        System.out.print("后置返回通知:" + "模拟删除临时文件");
        System.out.println(",被增强处理的方法:" + jp.getSignature().getName());
    }

    /**
     * 环绕通知
     * ProceedingJoinPoint是JoinPoint子接口,代表可以执行的目标方法
     * 返回值类型必须是Object
     * 必须一个参数是ProceedingJoinPoint类型
     * 必须throws Throwable
     */
    @Around("myPointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //开始
        System.out.println("环绕开始:执行目标方法前,模拟开启事务");
        //执行当前目标方法
        Object obj = pjp.proceed();
        //结束
        System.out.println("环绕结束:执行目标方法后,模拟关闭事务");
        return obj;
    }

    /**
     * 异常通知
     */
    @AfterThrowing(value = "myPointCut()", throwing = "e")
    public void except(Throwable e) {
        System.out.println("异常通知:" + "程序执行异常" + e.getMessage());
    }

    /**
     * 后置(最终)通知
     */
    @After("myPointCut()")
    public void after() {
        System.out.println("最终通知:模拟释放资源");
    }
}

程序的主入口运行文件

package aspectj.config;

import aspectj.dao.TestDao;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AOPTest {
    public static void main(String[] args) {
        //初始化Spring容器ApplicationContext
        AnnotationConfigApplicationContext appCon =
                new AnnotationConfigApplicationContext(AspectjAOPConfig.class);
        //从容器中,获取增强后的目标对象
        TestDao testDaoAdvice = appCon.getBean(TestDao.class);

        //执行方法
        System.out.println("========程序开始执行========");
        testDaoAdvice.save();
        System.out.println("================");
        testDaoAdvice.modify();
        System.out.println("================");
        testDaoAdvice.delete();

        appCon.close();
    }
}

运行结果

"C:\Program Files\Java\jdk1.8.0_60\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2020.2.2_Professional\lib\idea_rt.jar=60154:D:\IntelliJ IDEA 2020.2.2_Professional\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Administrator\Desktop\Code\springboot\ch1_4\build\classes;C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\aspectjweaver-1.9.2.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\commons-logging-1.2.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-aop-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-core-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-beans-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-aspects-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-context-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-expression-5.1.4.RELEASE.jar" aspectj.config.AOPTest
========程序开始执行========
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:save
保存
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:save
================
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:modify
修改
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:modify
================
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:delete
删除
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:delete

Process finished with exit code 0

使用Java类来代替spring的配置文件,就是说不写.xml这个配置文件

package aspectj.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

// 用这个文件来代替spring的配置文件
@Configuration//声明一个配置类
@ComponentScan("aspectj")//自动扫描aspectj包下使用的注解
@EnableAspectJAutoProxy//开启Spring对AspectJ的支持
public class AspectjAOPConfig {
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王摇摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值