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

参考自黑马培训机构

上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类

接下来介绍aop的注解的通知类型,和切入点的注解。参考自https://www.cnblogs.com/ltfxy/p/9885742.html

Spring的注解的AOP的通知类型

  • @Before:前置通知
  • @AfterReturning:后置通知
  • @Around:环绕通知
  • @AfterThrowing:异常抛出通知
  • @After:最终通知
  • @Pointcut:切入点的注解

切面类代码如下

package spring.day2_aop2;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/*
 * 编写切面类
 */
@Aspect
public class MyAspect {
    /*
     * 前置通知
     */
    @Before(value="execution(* spring.day2_aop2.OrderDao.save(..))")
    public void checkPri() {
        System.out.println("=============权限校验(前置通知)=============");
    }
    /*
     * 可以带返回值的后置通知
     */
    @AfterReturning(value="execution(* spring.day2_aop2.OrderDao.delete(..))",returning="result" )
    public void writeLog(Object result) {
        System.out.println("=============日志记录(后置通知)============="+result);
    }
    /*
     * 环绕通知
     */
    @Around(value="execution(* spring.day2_aop2.OrderDao.update(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("==========环绕前增强============");
        Object proceed = joinPoint.proceed();
        System.out.println("==========环绕后增强============");
        return proceed;
    }
    /*
     * 异常抛出通知
     */
    @AfterThrowing(value="execution(* spring.day2_aop2.OrderDao.find(..))")
    public void afterThrowing(JoinPoint joinPoint) {
        System.out.println("==========异常抛出通知============"+joinPoint);
    }
}

目标类,配置文件,及测试类代码如下

package spring.day2_aop2;
/*
 * 编写目标类
 */
public class OrderDao {
    
    public void save() {
        System.out.println("orderDao的save方法已经执行......");
    }
    public String delete() {
        System.out.println("orderDao的delete方法已经执行......");
        return "张三";
    }
    public void update() {
        System.out.println("orderDao的update方法已经执行......");
    }
    public void find() {
        System.out.println("orderDao的find方法已经执行......");
        int i=1/0;
    }
    
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===============================引入aop开发的约束============================ -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">
        
        <!-- ====在注解文件里开启aop的开发===== -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
        
       <!-- 配置目标类 --> 
       <bean id="orderDao" class="spring.day2_aop2.OrderDao"></bean>
       
       <!-- 配置切面类 -->
       <bean id="myAspect" class="spring.day2_aop2.MyAspect"></bean>
       
        
</beans>
package spring.day2_aop2;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/*
 * 编写测试类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext5.xml")
public class SpringDemo1 {

    @Resource(name="orderDao")
    private OrderDao orderDao;

    @Test
    public void demo1() {
        orderDao.save();
        orderDao.delete();
        orderDao.update();
        orderDao.find();
    }
}

测试结果如下:

 补充:

转载自https://www.cnblogs.com/yuwenlanleng/p/6704780.html

AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法: 
1)JoinPoint 
 java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
 Signature getSignature() :获取连接点的方法签名对象; 
 java.lang.Object getTarget() :获取连接点所在的目标对象; 
 java.lang.Object getThis() :获取代理对象本身; 
2)ProceedingJoinPoint 
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 
 java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 
 java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。

原文地址:https://www.cnblogs.com/zengcongcong/p/10364890.html