配置文件

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) { 
......
.....
}

注意:

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

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

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

基于注解的AOP配置的更多相关文章

  1. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  2. 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式

    8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...

  3. spring-第十七篇之spring AOP基于注解的零配置方式

    1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...

  4. 缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache

    本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中 ...

  5. 基于注解的形式配置Bean

    基于注解的方式配置Bean:也就说我们在每个Bean的类名前面注解一下,Spring会自动帮我们扫描Bean放进IOC容器中 I基于注解的方式配置Bean(没有依赖关系的Bean)有两个步骤: 1组件 ...

  6. 基于注解的bean配置

    基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...

  7. Struts2基于注解的Action配置

    使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...

  8. 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

    之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下 ...

  9. Spring_Spring与AOP_AspectJ基于注解的AOP实现

    一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...

随机推荐

  1. CPU 和 Linux 进程

    进程与线程 进程应该是Linux中最重要的一个概念.进程运行在CPU上,是所有硬件资源分配的对象.Linux中用一个task_struct的结构来描述进程,描述了进程的各种信息.属性.资源. Linu ...

  2. Mina APR传输与串口传输讲解---zhengli

    原文地址:Mina Transports(Apache Mina user guide Chapter6 Transport) 1.1.1.APR传输 1.1.1.1.介绍 APR (Apache P ...

  3. 2017-09-17 python 学习笔记

    Mock 库 介绍: http://blog.csdn.net/chdhust/article/details/50663729   说明mock能做什么. 可以考虑在调试方法时使用 Mock 库

  4. Excel开发学习笔记:发布VSTO下的Excel开发项目

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VST ...

  5. Python函数(五)-高阶函数

    函数接收的参数可以是数字,字符串,列表,元组,字典,集合,也可以是另一个函数,那么这个接收一个函数作为参数的函数就称为高阶函数 # -*- coding:utf-8 -*- __author__ = ...

  6. Python数据库(三)-使用sqlalchemy创建表

    首先需要安装sqlalchemy根据所需情况调用数据库接口,对数据库进行操作pymysql:mysql+pymysql://<username>:<password>@< ...

  7. 问题:oracle触发器无效且未通过重新验证;结果:触发器里面没有加分号(;)

    oracle无效且未通过重新验证 代码如下: SQL code如下: --创建中国地图表 create table  china_address (        id number not null ...

  8. NDK 编译报错:request for member 'FindClass' in something not a structure or union

    ndk编译 xx.c文件时一直报下面的错误: ”request for member 'FindClass' in something not a structure or union ...” 原因 ...

  9. hibernate学习笔记(6)组件属性以及单表操作

    组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...

  10. java字符编码转换研究(转)

    1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...