Spring学习笔记之AOP
title: Spring学习笔记之AOP
date: 2017-08-29 14:17:55
tags: Spring
AOP(Aspect-Oriented Programming)面向切面编程,只是一种编程规范,为完善 OOP 编程并补充其不足。
通俗讲就是为了把经常使用的模块(方法)抽取出来,组合成类,并在需要用到这些模块的地方将其插入。
几个术语
- 横切关注点:从每个方法中抽取出来的同一类非核心业务
- 切面:封装「横切关注点」的类
- 通知:横切关注点具体在切面中的具体实现
- 连接点:要用到切面的方法
- AOP代理:AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面
- 目标类:要用到切面的类,也就是连接点的集合
「通知」类型:
- @Before:前置通知,在方法执行之前执行
- @After:后置通知,在方法执行之后执行
- @AfterRunning:返回通知,在方法返回结果之后执行
- @AfterThrowing:异常通知,在方法抛出异常之后执行
- @Around:环绕通知,围绕着方法执行
基于注解实现的AOP
1. 导包
com.springsource.net.sf.cglib -2.2.0.jar
com.springsource.org.aopalliance-1.0.0 .jar
com.springsource.org.aspectj.weaver-1.6.8 .RELEASE.jar
commons-logging-1.1.3. jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE. jar
2. 在 applicationContext.xml 中配置,开启基于注解的 AOP 功能同时配置包扫描
<context:component-scan base-package=“com.zst.testAOP”></context:component-scan>
aop:aspectj-autoproxy</aop:aspectj-autoproxy>
3. 定义一个切面类,并把这个切面类加入到IOC容器中
@Aspect//表示这是一个切面类
@Component//加入IOC容器
4. 在切面类中声明通知方法
/*----AOPtosimpleCalculateClass-----*/
package com.zst.testAOP;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//环绕通知
@Aspect
@Component
public class AOPtosimpleCalculateClass {
@Around(value="execution(public * com.zst.testAOP.simpleCalculateImp.*(..) )")
public Object theAround(ProceedingJoinPoint point) {
Object[] args = point.getArgs();// 获取方法的形参列表
List<Object> asList = Arrays.asList(args);
Signature signature = point.getSignature();// 获取此方法的签名
String sigName = signature.getName();
System.out.println("signature=" + signature);
System.out.println("signature.getName()=" + sigName);
Object obj = null;
try {
try {
System.out.println("相当于 @Before ");
obj = point.proceed();// 执行此方法
} finally {
System.out.println("相当于 @After ");
}
System.out.println("相当于 @AfterRunning ");
} catch (Throwable e) {
//此处相当于 @AfterThrowing
System.out.println("有异常");
e.printStackTrace();
}
return obj;
}
}
/*----AOPTwo-----*/
package com.zst.testAOP;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AOPTwo {
@Pointcut(value="execution(public * com.zst.testAOP.simpleCalculateImp.*(..) )")
public void setIT(){
}
@Before(value="setIT()")
public void before(JoinPoint point){//org.aspectj.lang.JoinPoint
System.out.println("第二个配置的切面类————@Before开始");
Object[] args = point.getArgs();
List<Object> asList = Arrays.asList(args);
System.out.println(asList);
System.out.println("第二个配置的切面类————@Before结束");
}
@After(value="setIT()")
public void after(){
System.out.println("第二个配置的切面类————@After");
}
@AfterReturning(value="setIT()" ,returning="theReturn")
public void afterReturnning(Object theReturn){
System.out.println("第二个配置的切面类————@AfterReturning开始");
System.out.println("获得的参数是"+theReturn);
System.out.println("第二个配置的切面类————@AfterReturning结束");
}
@AfterThrowing(value="setIT()" ,throwing="ex")
public void catchThrow(Exception ex){
System.out.println("第二个配置的切面类————@AfterThrowing开始");
System.out.println(ex);
System.out.println("第二个配置的切面类————@AfterThrowing结束");
}
}
/*测试方法*/
public void tett(){
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
simpleCalculate bean = app.getBean("theCalculateBean",simpleCalculate.class);
bean.div(23,6);
//正常:@Before、@After、@AfterReturning
//异常:@Before、@After、@AfterThrowing
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)