Spring中AOP注解实现

本文详细介绍Spring AOP的实现原理及实战应用,包括前置通知、后置通知和环绕通知的使用,通过实例展示如何在User类的add方法上添加各种通知。

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

AOP的一些名词

连接点:类中可以被增强的方法
切入点:类中实际被增强的方法
通知:实际增强方法的部分
切面:把通知应用到切入点的过程
其中通知常用的有前置通知,后置通知,环绕通知

AOP具体实现

Spring AOP是基于AspectJ实现的,所以需要先引入依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

这里我们通过注解来实现,所以开启注解,然后开启注解扫描的包,同时开启Aseptic生成代理对象

<!--    开启注解支持-->
<context:annotation-config/>
<!--    配置要扫描的包下的注解生效-->
<context:component-scan base-package="com.hzy.aopanno"/>
<!--    开启Aspect生成代理对象-->
<aop:aspectj-autoproxy/>

准备工作做的差不多了,可以开始应用了,如果我们要对User类下的add方法加一个前置通知,也就是执行该方法前执行的操作,首先创建一个User类,并把该类注入到Spring

package com.hzy.aopanno;

import org.springframework.stereotype.Component;

@Component
public class User {
    public void add() {
        System.out.println("add ...");
    }
}

然后是一个User的代理类,也就是负责通知的,这里的@Aspect就是切面,把该通知应用到切入点,其中execution(* com.hzy.aopanno.User.add(..))代表对add方法进行切入,如果所有的方法切人是execution(* com.hzy.aopanno.User.*(..))

package com.hzy.aopanno;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class UserProxy {
    @Before(value = "execution(* com.hzy.aopanno.User.add(..))")
    public void before() {
        System.out.println("before ...");
    }
}

下面我们测试一下

import com.hzy.aopanno.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user", User.class);
        user.add();
    }
}

在这里插入图片描述
然后我们再进行演示after和around
修改代理类

package com.hzy.aopanno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class UserProxy {
    @Before(value = "execution(* com.hzy.aopanno.User.add(..))")
    public void before() {
        System.out.println("before ...");
    }

    @After(value = "execution(* com.hzy.aopanno.User.add(..))")
    public void after() {
        System.out.println("after ...");
    }

    @Around(value = "execution(* com.hzy.aopanno.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前 ...");
        proceedingJoinPoint.proceed();
        System.out.println("环绕之后 ...");

    }
}

观察测试结果会发现,在before之前会环绕,after之前也会环绕
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贺志营

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

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

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

打赏作者

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

抵扣说明:

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

余额充值