当前位置: 首页 > news >正文

基于注解的AOP配置

 

配置文件

spring配置文件中的约束

<?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配置文件中配置Spring创建容器时要扫描的包

 <context:component-scan base-package="com.itheima"></context:component-scan>

 在spring配置文件中开启spring对注解AOP的支持

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

在pom.xml中添加依赖

<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
</dependency>

若不使用配置文件而使用配置类配置Spring

使用配置类而不使用XML文件(代替bean.xml)对spring进行配置

@Configuration //指定当前类是一个spring配置类
@ComponentScan(basePackages="com.itheima") // 配置spring创建容器时要扫描的包
@EnableAspectJAutoProxy //配置spring开启注解AOP的支持
public class SpringConfiguration { }

 

注解配置

把资源使用注解配置

 

把通知类也使用注解配置

在通知类上使用@Aspect注解声明为切面

 

在增强的方法上使用注解配置通知

  @Before

    作用: 把当前方法看成是前置通知。

    属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。

//开启事务
@Before("execution(* com.itheima.service.impl.*.*(..))") public void beginTransaction() { try { dbAssit.getCurrentConnection().setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } }

  @AfterReturning

    作用: 把当前方法看成是后置通知。

    属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用

  @AfterThrowing

    作用: 把当前方法看成是异常通知。

    属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用

  @After

    作用: 把当前方法看成是最终通知。

    属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用

环绕通知注解配置

  @Around

    作用: 把当前方法看成是环绕通知。

    属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。

未使用切入点表达式注解, 直接在@Around中指定切入点表达式

/** * 环绕通知 
* @param pjp 
* @return 
*/ 
@Around("execution(* com.itheima.service.impl.*.*(..))")
public Object transactionAround(ProceedingJoinPoint pjp) { 
  //定义返回值 
  Object rtValue = null;
  try {
    //获取方法执行所需的参数 
    Object[] args = pjp.getArgs();
    //前置通知:开启事务 
    beginTransaction(); 
    //执行方法
    rtValue = pjp.proceed(args); 
    //后置通知:提交事务 
    commit(); 
  }catch(Throwable e) { 
    //异常通知:回滚事务
    rollback(); 
    e.printStackTrace();
  }finally { 
    //最终通知:释放资源 
    release(); 
  }
  return rtValue;
}    

使用切入点表达式注解, 在@Around中指定切入点表达式引用

  @Pointcut

  作用: 指定切入点表达式

  属性:value:指定表达式的内容

  使用时

    @Around("pt1()")    千万别忘了写括号

@Pointcut("execution(* com.itheima.service.impl.*.*(..))") 
private void pt1() {}

@Around("pt1()")//注意:千万别忘了写括号
public Object transactionAround(ProceedingJoinPoint pjp) { 
......
.....
}

 注意:

在使用除环绕通知的其他通知时,他们的顺序并不是一定的最终通知会执行优先于后置通知与环绕通知,

因此当我们使用最终通知来释放一些资源的时候,可能会出现资源已经释放,但是后置通知仍在使用的情况,这时就会出现错误,

因此我们遇到这种情况时要特别注意,为了保证通知的顺序,我们必要的使用环绕通知,环绕通知的执行顺序是一致的。

转载于:https://www.cnblogs.com/mkl7/p/10698294.html

相关文章:

  • python-day2-变量
  • 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
  • 生产巡检
  • Android 内存监测工具 DDMS
  • Go语言介绍
  • 多态的应用-例子
  • Redis实战 - 3.Hash
  • session的使用
  • C++ string使用
  • 外连接查询
  • C#中三层架构UI、BLL、DAL、Model实际操作
  • Opencart3.0 本地环境 前台无法提交订单
  • springcloud(六)-Ribbon配置自定义算法
  • NABCD分析---校园服务
  • go语言学习逻辑运算符if判断,iota的理解
  • JavaScript-如何实现克隆(clone)函数
  • JS 中的深拷贝与浅拷贝
  • [数据结构]链表的实现在PHP中
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 〔开发系列〕一次关于小程序开发的深度总结
  • CAP理论的例子讲解
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript异步流程控制的前世今生
  • JS基础之数据类型、对象、原型、原型链、继承
  • Sublime Text 2/3 绑定Eclipse快捷键
  • swift基础之_对象 实例方法 对象方法。
  • Vim 折腾记
  • vue-cli在webpack的配置文件探究
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 工作中总结前端开发流程--vue项目
  • 前端性能优化——回流与重绘
  • 《天龙八部3D》Unity技术方案揭秘
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三)c52学习之旅-点亮LED灯
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net各种迷惑命名解释
  • .NET和.COM和.CN域名区别
  • ?
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Bean, @Component, @Configuration简析
  • [ABC294Ex] K-Coloring
  • [APIO2012] 派遣 dispatching