配置文件

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. 关于文件结束符EOF

    EOF 是 End Of File 的缩写. 在 C 语言中,它是在标准库中定义的一个宏. 人们经常误认为 EOF 是从文件中读取的一个字符(牢记).其实,EOF 不是一个字符,它被定义为是 int ...

  2. Nginx报错 connect() failed (111: Connection refused) while connecting to upstream 的解决方法

    今天访问公司的网站突然报错,抛出一些英文,提示看一下Nginx的error.log日志: cd  /usr/local/nginx/logs/  看到了error.log ,下一步 tail -n 2 ...

  3. n年的一次聚会

    今日聚会有a,b,b1,c,d 五人一起吃饭. 先谈谈各自的变化吧. a 毕业之后,他爸给他买了一个京a的牌照,然后出印度留学,然后回到北京,现在算一个中层领导,不过比较忙,刚刚聚餐完毕就立马回去加班 ...

  4. Oracle之into

    ), NVL() INTO SALE_ID, STORE_ID FROM SALEFROMSTORE WHERE ORDERID = IN_ORDER_ID; 这里要注意,into的时候是一个sele ...

  5. spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程

    它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...

  6. strcmp与strncmp的区别

    ==================  strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串. strcmp C/C++函数,比较两个字符串  设这两个字符串为str1,s ...

  7. php中的foreach改变数组的值的问题

    翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误 ...

  8. delphi VCL组件同名继承

    当我们在扩展一个 vcl 组件功能的时候,既想保留IDE中能拖动大小与直接设置属性的功能,又想减少写创建与释放代码和安装扩展后新组件的麻烦,那么本文中的方法,就非常实用了. 以给TStringGrid ...

  9. Solaris Tips: Repairing the Boot Archive (ZT)

    http://www.seedsofgenius.net/solaris/solaris-tips-repairing-the-boot-archive 注意以下是系统盘非镜像情况下的操作,如果系统盘 ...

  10. Spring注解-TaskScheduler

    一.定义配置类 import org.springframework.context.annotation.ComponentScan; import org.springframework.cont ...