AOP案例

news/2024/12/2 16:09:28/

1. 案例-测量业务层接口万次执行效率

能描述出环绕通知里面的实现步骤

1.1 需求和分析

需求:任意业务层接口执行均可显示其执行效率(执行时长)

分析:

1:业务功能:业务层接口执行前后分别记录时间,求差值得到执行效率

2:通知类型选择前后均可以增强的类型——环绕通知

1.2 代码实现

【前置工作】环境准备 (在jdbcTemplate CRUD中操作)

  1. Spring整合JdbcTemplate对spring_db数据库中的Account进行CRUD操作

  2. Spring整合Junit测试CRUD是否OK。

  3. 在pom.xml中添加aspectjweaver切入点表达式依赖

  4. ... ...

【第一步】编写通知类

@Component
@Aspect
public class ProjectAdvice {//匹配业务层的所有方法@Pointcut("execution(* com.by.service.*Service.*(..))")private void servicePt(){}//设置环绕通知,在原始操作的运行前后记录执行时间@Around("ProjectAdvice.servicePt()") //本类类名可以省略不写public void runSpeed(ProceedingJoinPoint pjp) throws Throwable {//获取执行的签名对象Signature signature = pjp.getSignature();//获取接口/类全限定名String className = signature.getDeclaringTypeName();//获取方法名String methodName = signature.getName();//记录开始时间long start = System.currentTimeMillis();//执行万次操作for (int i = 0; i < 10000; i++) {pjp.proceed();}//记录结束时间long end = System.currentTimeMillis();//打印执行结果System.out.println("万次执行:"+ className+"."+methodName+"---->" +(end-start) + "ms");}
}

【第二步】在SpringConfig配置类上开启AOP注解功能

@Configuration
@ComponentScan("com.by")
@PropertySource("classpath:jdbc.properties")
@Import(jdbcConfig.class)
@EnableAspectJAutoProxy  //开启aop注解扫描
public class SpringConfig {
}

【第三步】运行测试类,查看结果

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTest {@Autowiredprivate AccountService accountService;@Testpublic void testFindById(){Account account = accountService.findById(2);}@Testpublic void testFindAll(){List<Account> list = accountService.findAll();}
}

运行结果:

2. AOP通知获取数据

  • 获取切入点方法的参数

    • JoinPoint:适用于前置、后置、返回后、抛出异常后通知

    • ProceedJointPoint:适用于环绕通知

  • 获取切入点方法返回值

    • 返回后通知

    • 环绕通知获

  • 获取切入点方法运行异常信息

    • 抛出异常后通知

    • 环绕通知

AOP切入点数据获取

在环绕通知中可以获取到哪些数据?

数据准备

dao接口,dao实现类,Test测试类

public interface UserDao {public String  findName(int id);
}@Component
public class UserDaoImpl implements UserDao {@Overridepublic String findName(int id) {System.out.println("id"+id);if(true)throw new NullPointerException();return "body";}
}@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AppTest {@Autowiredprivate UserDao userDao;@Testpublic void test(){String name = userDao.findName(1);System.out.println(name);}

编写通知类

@Component
@Aspect
public class MyAcpectde {@Pointcut("execution(* com.by.dao.impl.UserDaoImpl.*(..))")public void pt(){}}

2.1 获取参数

说明:在前置通知和环绕通知中都可以获取到连接点方法的参数们

  • JoinPoint对象描述了连接点方法的运行状态,可以获取到原始方法的调用参数

@Before("pt()")
public void before(JoinPoint jp) {Object[] args = jp.getArgs(); //获取连接点方法的参数们System.out.println(Arrays.toString(args));
}
  • ProccedJointPoint是JoinPoint的子类

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {Object[] args = pjp.getArgs(); //获取连接点方法的参数们System.out.println(Arrays.toString(args));Object ret = pjp.proceed();return ret;
}

2.2 获取返回值

说明:在返回后通知和环绕通知中都可以获取到连接点方法的返回值

@AfterReturning(value = "pt()",returning = "ret")
public void afterReturning(String ret) { //变量名要和returning="ret"的属性值一致System.out.println("afterReturning advice ..."+ret);
}
  • 环绕通知中可以手工书写对原始方法的调用,得到的结果即为原始方法的返回值

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {// 手动调用连接点方法,返回值就是连接点方法的返回值Object ret = pjp.proceed();return ret;
}

2.3 获取异常

说明:在抛出异常后通知和环绕通知中都可以获取到连接点方法中出现的异常

  • 抛出异常后通知可以获取切入点方法中出现的异常信息,使用形参可以接收对应的异常对象

@AfterThrowing(value = "pt()",throwing = "t")
public void afterThrowing(Throwable t) {//变量名要和throwing = "t"的属性值一致System.out.println("afterThrowing advice ..."+ t);
}
  • 抛出异常后通知可以获取切入点方法运行的异常信息,使用形参可以接收运行时抛出的异常对象

@Around("pt()")
public Object around(ProceedingJoinPoint pjp)  {Object ret = null;//此处需要try...catch处理,catch中捕获到的异常就是连接点方法中抛出的异常try {ret = pjp.proceed();} catch (Throwable t) {t.printStackTrace();}return ret;
}

http://www.ppmy.cn/news/730835.html

相关文章

科研绘图中的图片格式问题

本文分析了所有主流图片格式的优缺点。 科研绘图中的图片格式问题 科研论文投稿需要根据期刊的要求上传符合要求的图片&#xff0c;以下为科研绘图中相关格式问题汇总。 1 位图和矢量图的区别 位图&#xff08;Bitmap&#xff09; 又称栅格图&#xff08;Raster graphics&…

李彦宏: 《硅谷商战》 节选

作者&#xff1a;李彦宏 第一回安德森初闯硅谷 克拉克慧眼识才 第二回华尔街新星照耀 西雅图阴雨连绵 第三回闭门造车Oak受挫 借尸还魂Java重生 第四回写一次“跑”遍天下 开赌局二虎对决 第五国领航员踌躇满志 探索者卧薪尝胆 第六回上网服务烽烟骤起 美国在线渐成赢家 第七回…

电脑疑难80问

电脑疑难80问 1、开机黑屏怎么办?指导用户听一下有没有自检的嘀声,如果有,检查一下显示器信号线2.鼠标双击不起作用怎么办?控制面板中鼠标双击速度设置过快.3、如何从网络注销&#xff1f;单击“开始”&#xff0c;然后单击“注销”&#xff0c;单击“是”&#xff0c;然后在…

操作系统及软件常用的日语单词

"Out Look"中的日语单词 メールメッセージ 邮件 ニュースメッセージ 新闻邮件 インスタントメッセージ 即时邮件 フォルダ 文件夹 連絡先 联系人 添付ファイルの保存 保存附件 ひな形として保存 …

防范黑客木马

转自&#xff1a;http://bbs.51testing.com/thread-124374-1-1.html、 即使是很好的实现了TCP/IP协议&#xff0c;由于它本身有着一些不安全的地方&#xff0c;从而可以对TCP/IP网络进行攻击。这些攻击包括序列号欺骗&#xff0c;路由攻击&#xff0c;源地址欺骗和授权欺骗。本…

JavaScript技术

● &运算符_1.htm● JavaScript的脆弱性_1.htm● JavaScript技巧环绕三维文字_1.htm● JavaScript时间显示三大心法_1.htm● Javascript特效欣赏(一)飘雪_1.htm● Java技巧(一)会变色的超链接_1.htm● 弹出式说明窗口---JavaScript的使用_1.htm● 第八讲WEB页面信息交互_…

虚幻引擎 4.9

本发布版本包含了129个重大修改&#xff0c;这些修改由虚幻引擎的令人赞叹的社区开发者提交而来。感谢这些开发者对虚幻引擎4.9的贡献&#xff1a; Andrew Zhilin (zoon), Artem V. Navrotskiy (bozaro), Artyom Sovetnikov, Ben Rog-Wilhelm(zorbathut), Ben Wiklund (bwiklun…

Web

Web #####1.简述对web标准以及w3c的理解与认识。W3C(world wide web consortium)&#xff0c;万维网联盟&#xff0c; Web标准由万维网联盟(W3C)制定&#xff0c;W3C 创建和维护Web标准。最重要W3C标准有&#xff1a;HTML、CSS、XML、XSL、DOM对于浏览器开发商和web程序开发人员…