Spring学习笔记之AOP
来源:互联网 发布:c语言文件打开方式手机 编辑:程序博客网 时间:2024/05/20 12:21
AOP(Aspect-Oriented Programming)面向切面编程,只是一种编程规范,为完善 OOP 编程并补充其不足。
通俗讲就是为了把经常使用的模块(方法)抽取出来,组合成类,并在需要用到这些模块的地方将其插入。
几个术语
- 横切关注点:从每个方法中抽取出来的同一类非核心业务
- 切面:封装「横切关注点」的类
- 通知:横切关注点具体在切面中的具体实现
- 连接点:要用到切面的方法
- AOP代理:AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面
- 目标类:要用到切面的类,也就是连接点的集合
「通知」类型:
1. @Before:前置通知,在方法执行之前执行
2. @After:后置通知,在方法执行之后执行
3. @AfterRunning:返回通知,在方法返回结果之后执行
4. @AfterThrowing:异常通知,在方法抛出异常之后执行
5. @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 功能同时配置包扫描
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@Componentpublic 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@Componentpublic 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 }
阅读全文
0 0
- Spring之AOP(学习笔记)
- 学习笔记之spring-AOP
- Spring学习笔记之AOP
- Spring学习笔记之AOP
- Spring 学习笔记 (III) 之 Spring AOP
- Spring 2.5.6学习笔记 之 AOP
- Spring学习笔记之AOP基础
- java学习笔记之: spring-aop
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- spring aop学习笔记
- spring aop学习笔记
- Spring AOP学习笔记
- spring AOP 学习笔记
- spring AOP学习笔记
- Leetcode 98. Validate Binary Search Tree
- 编程珠玑 (续)(1) Pearls C/C++性能监测工具
- JEESZ-SSO解决方案
- Zsh配置
- 事件冒泡和事件捕获
- Spring学习笔记之AOP
- 编程珠玑 Pearls(2)
- linux 使用遇到的问题
- 编程珠玑 Pearls(3.2) python脚本
- 编程珠玑 Pearls(1)
- 编程珠玑 Pearls(4) 编写正确的程序
- linux shell脚本攻略笔记
- Cygwin
- 编程珠玑 Pearls(8)