基于Aspectj 注解实现 spring AOP
2024-10-07 20:31:47
AOP 面向切面编程,是 OOP (面向对象编程)的补充
术语
横切关注点:方法中非主要业务逻辑部分
比如运算的模块:有验证参数、执行方法前的操作、执行方法、执行方法后的操作,验证参数、执行方法前后的操作是横切关注点
比如权限验证模块:在执行增删改查等方法前要进行验证,主要业务逻辑其实是增删改查,验证权限是横切关注点
比如日志模块:执行某方法前后都要生成文件或者往文件写入记录,日志记录是横切关注点
切面:横切关注点的抽象到一个类中
就是把横切关注点封装成一个类,在主要业务逻辑执行根据情况来调用
声明切面的步骤:1,把该类放入 IOC 容器,进行管理;2,使用注解 @Aspect 表明这是一个切面
通知:是切面类中的方法,用于在目标方法执行时执行
前置通知(@Before):目标方法执行前
后置通知(@After):目标方法执行后,无论是否发生异常
返回通知(@AfterRunning):目标方法正常结束后执行,可以知道目标方法的返回值
异常通知(@AfterThrowing):目标方法产生异常时执行,可以访问异常对象,进行打印,也可以指定异常才执行
环绕通知@(Around):包含上面4种
声明通知的步骤:1,指明通知类型;2,指明目标方法;3,配置文件使通知生效
连接点:用于获取目标方法的详细信息,方法名,参数值;JoinPoint
示例:
/**
* .切面类
* .第一步:添加 @Aspect 注解
* .第二步:添加 @Component 注解
* .第三步:指明通知类型和目标方法
*/
@Aspect
@Component
public class AspectCompute {
/**
* .第一个 * :任意返回值
* .第二个 * :com.weipai.service 包下的任意类
* .第三个 * :任意方法
* .(..):所有参数,不区分类型
*/
@Before("execution(* com.weipai.service.*.*(..))")
public void beforeMethod(JoinPoint info) {
// 获取目标方法名
String methodName = info.getSignature().getName();
// 获取目标方法参数值
List<Object> args = Arrays.asList(info.getArgs());
System.out.println("前置通知,方法名:" + methodName + ",参数:" + args);
}
}
@Service("compute")
public class Compute {
public void add(int i, int j, String k) {
System.out.println(i + j + k);
}
}
<!-- 扫描,支持spring注解 -->
<context:component-scan base-package="com.weipai.aspect,com.weipai.service" /> <!-- 配置 aspect :自动生成代理类 -->
<aop:aspectj-autoproxy />
public class ComputeTest extends TestCase { private ApplicationContext ctx;
private Compute comp; protected void setUp() throws Exception {
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
comp = (Compute) ctx.getBean("compute");
} public void testAdd() {
comp.add(1, 3, "hello");
} }
最新文章
- Linux下history命令用法
- 浅谈-js递归函数
- Javascript中大括号“{}”的多义性
- BZOJ 1013 &; 高斯消元
- vs emulator for android使用
- imx6 kernel clock
- myeclipse中java文件中文注释乱码问题
- C# SQL增删查改
- Notes on Probabilistic Latent Semantic Analysis (PLSA)
- Python学习 - 编写一个简单的web框架(一)
- 怎样使用pyinstaller打包
- twitter 监控登陆活动
- JavaScrtip之JS最佳实践
- OC本学习笔记Foundation框架NSString与NSMutableString
- Vim实用小技巧
- A计划
- 如何通过织云 Lite 愉快地玩转 TSW
- Python——xlsxwriter模块的使用
- java反射机制与动态代理
- java中静态代码块的用法和static用法(转)