Spring之Aop的注解配置

本文详细介绍如何在Spring框架中使用AOP(面向切面编程),包括创建接口和实现类,配置切面,以及如何使用各种通知类型如@Before、@After、@AfterReturning等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先要添加jar包

 

2.写方法接口

public interface calculate {

     int add(int i, int j);
    
     int sub(int i, int j);
    
     int mul(int i, int j);
    
     int div(int i, int j);
    
}

 

3.写方法的实现类,并把其加入到IOC容器中去

@Component
public class calculateImpl implements calculate {
    
    public int add(int i, int j) {
        return i+j;
    }
    
    public int sub(int i, int j) {
        return i-j;
    }
    
    public int mul(int i , int j) {
        return i*j;
    }
    
    public int div(int i,int j) {
        return i/j;
    }

}
 

4.写切面,首先要把这个类加入到IOC容器中去,其次利用@Aspect声明它为切面。

定义所想执行的方法,在calculateImpl方法实现的相应位置加上通知。

在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的,这时候可利用@Order()注解来设置优先级,数字越小,优先级越高。

 

@Before: 前置通知, 在方法执行之前执行

@After: 后置通知, 在方法执行之后执行

@AfterRunning: 返回通知, 在方法返回结果之后执行

@AfterThrowing: 异常通知, 在方法抛出异常之后

@Around: 环绕通知, 围绕着方法执行

 

 

@Component
@Aspect
public class SimpleAspect {


    /*
     * @Pointcut声明切入点表达式。
     * 定义一个方法,方法中一般不需要写代码
     */
    @Pointcut("execution(* com.zxw.spring.bean.aop.*.*(int,int))")
    public void pointCut() {
    }
    

    @Before("pointCut()")
    public void before(JoinPoint joinPoint) {
        //如果需要这里可以通过JoinPoint取出参数进行处理
        
        //通过joinpoin获取签名的方法获取方法名
        String methoName = joinPoint.getSignature().getName();
        
        //获取要传入的参数
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        
        System.out.println(methoName+"哈哈,方法执行前!"+args);
    }

 

    //在后置通知中还不能访问返回的结果
    @After("pointCut()")
    public void after(JoinPoint joinPoint) {
        
        //通过joinpoin获取签名的方法获取方法名
        String methoName = joinPoint.getSignature().getName();
        
        //获取要传入的参数
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        
        System.out.println(methoName+"哈哈,方法执行后!"+args);
    }

 

    //在返回通知中能访问返回的结果。在返回通知中, 只要将 returning 属性添加到 @AfterReturning 注解中, 就可以访问连接点的返回值. 该属性的值即为用来传入返回值的参数名称. 必须在通知方法的签名中添加一个同名参数. 在运行时, Spring AOP 会通过这个参数传递返回值.
    @AfterReturning(value = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("返回值--> "
                + result);
    }

 

    //在出现制定异常的时候可以执行相应的代码
    @AfterThrowing(value = "pointCut()", throwing = "error")
    public void afterThrowing(JoinPoint jp, Throwable error) {
        System.out.println("error:" + error);
    }

 

    /*
     * 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点
     * 环绕通知需要携带ProceedingJoinPoint类型的参数
     * ProceedingJoinPoint类型的参数可以决定是否执行该方法
     * 环绕通知必须有返回值,返回值为目标方法的返回值, 否则会出现空指针异常
     */
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) {
        Object result = null;
        String methoName = pjp.getSignature().getName();
        try {
            //前置通知
            System.out.println(methoName+"around begin");
            
            //执行目标方法
            result = pjp.proceed();
            
            //后置返回通知
            System.out.println("around返回值--> "+ result);
        } catch (Throwable ex) {
            //异常通知
            System.out.println("around出错了!");
        }
        //后置通知
        System.out.println(methoName+"around end");
        return result;
    }

}

 

5.在配置文件中进行设置,并加入aop的命名空间Namespaces

<!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.zxw.spring.bean.aop"/> 
    
 <!-- 使AspjectJ注解起作用:自动为匹配的类生成代理对象 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值