使用注解写aop时最好使用环绕通知写

切面类:

/**
* 用于记录日志的工具类,它里面提供了公共的代码
*/
@Component("logger")
@Aspect //表示当前类是一个切面类
public class Logger { @Pointcut("execution(* cn.flypig666.service.impl.*.*(..))")
private void pt1(){}; /**
* 前置通知
*/
@Before("pt1()")
public void beforePrintLog(){
System.out.println("前置通知Logger类中的beforePrintLog方法开始记录日志了....");
} /**
* 后置通知
*/
@AfterReturning("pt1()")
public void afterReturningPrintLog(){
System.out.println("后置通知Logger类中的afterReturningPrintLog方法开始记录日志了....");
} /**
* 异常通知
*/
@AfterThrowing("pt1()")
public void afterThrowingPrintLog(){
System.out.println("异常通知Logger类中的afterThrowingPrintLog方法开始记录日志了....");
} /**
* 最终通知
*/
@After("pt1()")
public void afterPrintLog(){
System.out.println("最终通知Logger类中的afterPrintLog方法开始记录日志了....");
} /**
* 环绕通知:
* 当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了,
* 分析:
* 通过对比动态代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而我们代码中没有
* 解决:
* Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法
* 该接口可以作为环绕通知的方法参数,在程序运行时,spring框架为我们提供了该接口的实现类给我们使用
*
* spring中的环绕通知:
* 它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式
*/
@Around("pt1()")
public Object aroundPrintLog(ProceedingJoinPoint pjp) {
Object rtValue = null;
try {
Object[] args = pjp.getArgs(); // 得到方法执行所需的参数 System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....前置"); pjp.proceed(args); // 明确调用业务层方法(切入点方法) System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....后置");
return rtValue;
} catch (Throwable throwable) {
System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....异常");
throw new RuntimeException(throwable);
} finally {
System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....最终");
}
} }

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置spring创建容器时要扫描的包-->
<context:component-scan base-package="cn.flypig666"></context:component-scan> <!-- 配置spring开启注释AOP的支持-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>

使用@EnableAspectJAutoProxy可以省略<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

表示开启注解AOP的支持,在springboot中不用写,已默认开启

最新文章

  1. 3Sum algorithm - 非常容易理解的实现 (java)
  2. maven scope含义的说明
  3. SQL语句的基础
  4. tomcat 启动时内存溢出
  5. Umbraco中更换IndexSet中的NodeType后,搜索页面没有做出对应更改的效果
  6. Sybase isql常用命令
  7. Php 关于构造函数
  8. windows 本地构建hadoop-spark运行环境(hadoop-2.6, spark2.0)
  9. Struts2学习笔记五 拦截器
  10. 批量处理word所有回车行
  11. Mysql优化系列(1)--Innodb重要参数优化
  12. css网页布局血泪经验
  13. 无需登录-悟空CRM 存储型XSS
  14. js基础面试高频面点1:变量提升
  15. AFNetworking 2.x 的SSL身份认证
  16. Locality preserving hashing for fast image search: theory and applications
  17. SpringBoot中使用Jackson导致Long型数据精度丢失问题
  18. 用node是踩过的一些坑
  19. JAVA Eclipse中如何简易的实现消息机制
  20. Sentinel系统监控Redis主从节点

热门文章

  1. NX二次开发-查询信息窗口是否打开UF_UI_is_listing_window_open
  2. npm run 同时执行多个命令
  3. vue wabpack 切换开发环境 和生成环境 的接口地址
  4. class11_messagebox 弹窗
  5. spark自定义函数之——UDAF使用详解及代码示例
  6. 春节跳槽最新Java面试题及答案整理
  7. USACO2008 Patting Heads /// 筛数 oj24705
  8. 23种常用设计模式的UML类图
  9. InsightFace源码以及pre-train模型以及使用
  10. MySQL数据库之DDL(数据定义语言)