Spring AOP实例操作 简单易懂

AOP的功能,不改变源代码可以增强类中的方法      (增强 = 代理

AOP切入点表达式:

execution([权限修饰符] [返回值类型] [类全路径] [方法名称] ([参数列表]))

例如:

1
@Before(value = "execution(* com.minelsg.User.add(..))")

 

连接点

在一个类中,哪些方法可以被增强,那这些方法就称为连接点

切入点

实际被真正增强的方法,称为切入点

 

通知(增强)

实际增强的逻辑部分称为通知(增强)。
通知有多种类型:前置通知、后置通知、环绕通知、异常通知、最终通知。
--------------------------------------------------------------------
#前置通知@Before:   方法之前会执行
#后置通知@AfterReturning: 方法之后会执行
#环绕通知@Around:   方法的前面和后面都会执行
#异常通知@AfterThrowing: 当方法出现异常会执行
#最终通知@After:   不管有没有异常都会执行类似于finally

 

切面

把通知应用到切入点的过程就称为切面

以下为实例:

 

 

被增强类

1
2
3
4
5
6
@Component
public class User {
    public void add() {
        System.out.println("add.......");
    }
}

 

增强的类(代理类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Component
@Aspect  //生成代理对象
public class UserProxy {
    //前置通知
    //@Before注解表示作为前置通知
    @Before(value = "execution(* com.minelsg.User.add(..))")
    public void before() {
        System.out.println("before.....");
    }
    //执行后通知(最终通知)
    @After(value = "execution(* com.minelsg.User.add(..))")
    public void after(){
        System.out.println("after......");
    }
    //执行后返回值通知
    @AfterReturning(value = "execution(* com.minelsg.User.add(..))")
    public void afterReturning(){
        System.out.println("AfterReturning.........");
    }
    //@异常通知
    @AfterThrowing(value = "execution(* com.minelsg.User.add(..))")
    public void afterThrowing(){
        System.out.println("AfterThrowing.........");
    }
    //@Around环绕通知
    @Around(value = "execution(* com.minelsg.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("环绕之前.........");
 
        //add方法执行
        proceedingJoinPoint.proceed();
 
        System.out.println("环绕之后.........");
    }
}

 

通过Ioc注入后执行

1
2
3
4
5
6
7
8
public class TestAop {
    @Test
    public void testAopAnno(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        User user = (User)context.getBean("user");
        user.add();
    }
}

 

输出结果

1
2
3
4
5
6
环绕之前.........
before.....
add.......
AfterReturning.........
after......
环绕之后.........

 done~~

 

posted @   MineLSG  阅读(265)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示