在了解spring aop中的关键字(如:连接点(JoinPoint)、切入点(PointCut)、切面(Aspact)、织入(Weaving)、通知(Advice)、目标(Target)等)后进行了简单使用测试。

1.在spring的xml配置文件中添加代码,开启aop注解自动代理

  1. <!-- 启动aspectJ自动代理 -->
  2. <aop:aspectj-autoproxy />

2.创建一个方法作为连接点:

  1. public class TestService {
  2.  
  3. public void method1(){
  4. System.out.println("执行method1");
  5. }
  6. }

3.创建切面类(注解方式配置):

  1. @Aspect// 注解该类为切面类
  2. @Component
  3. public class LogIntercepter {
  4.  
  5. // 若要以字符串形式表示执行目标条件必须使用final修饰
  6. private final String EXEC = "execution(* com.lwl.service..*.*(..))";
  7.  
  8. // 执行顺序:环绕通知(前),前置通知,环绕通知(后),后置通知,返回后通知
  9. @Pointcut("execution(* com.lwl.service..*.*(..))")// 切入点
  10. public void pointcutMethod(){};
  11.  
  12. @Before("pointcutMethod()")// 方法执行前执行
  13. public void before(){
  14. System.out.println("method before");
  15. }
  16.  
  17. @After("pointcutMethod()")// 方法执行后执行
  18. public void after(){
  19. System.out.println("method after");
  20. }
  21.  
  22. @AfterReturning("pointcutMethod()")// 方法返回后执行
  23. public void afterReturning(){
  24. System.out.println("method afterReturning");
  25. }
  26.  
  27. @AfterThrowing("pointcutMethod()")// 方法抛异常后执行
  28. public void afterThrowing(){
  29. System.out.println("method afterThrowing");
  30. }
  31.  
  32. @Around("pointcutMethod()")// 环绕通知
  33. public void around(ProceedingJoinPoint pr){
  34. System.out.println("method around bg");
  35. try {
  36. pr.proceed();// 执行目标方法
  37. } catch (Throwable e) {
  38. e.printStackTrace();
  39. }
  40. System.out.println("method around ed");
  41. }
  42. }

调用method1()后通知的打印先后顺序结果为:

  1. method around bg
  2. method before
  3. 执行method1
  4. method around ed
  5. method after
  6. method afterReturning

Spring AOP xml方式配置,在Spring的xml配置文件中加入(备忘):

  1.  
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:aop="http://www.springframework.org/schema/aop"
  4. xsi:schemaLocation="http://www.springframework.org/schema/aop
  5. http://www.springframework.org/schema/aop/spring-aop.xsd">
  1. <!-- 1.注册实体类(目标方法所在类) -->
  2. <bean id="userDao" class="com.huitong.Dao3.UserDao"></bean>
  3. <!-- 2.注册AOP切面实体类(通知方法所在类) -->
  4. <bean id="aop" class="com.huitong.Dao3.Aop"></bean>
  5.  
  6. <aop:config>
  7. <!-- 3.切入点配置 -->
  8. <aop:pointcut expression="execution(* com.huitong.Dao3.UserDao.*(..))" id="pt"/>
  9. <!-- 4.切面配置 -->
  10. <aop:aspect id="asp" ref="aop">
  11. <!-- 5.通知配置 -->
  12. <aop:around method="around" pointcut-ref="pt"/>
  13. <aop:before method="before" pointcut-ref="pt"/>
  14. </aop:aspect>
  15. </aop:config>

AOP相关的术语:

    • 通知: 通知定义了切面是什么以及何时使用的概念。Spring 切面可以应用5种类型的通知:

      • 前置通知(Before):在目标方法被调用之前调用通知功能。
      • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
      • 返回通知(After-returning):在目标方法成功执行之后调用通知。
      • 异常通知(After-throwing):在目标方法抛出异常后调用通知。
      • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
    • 连接点:是在应用执行过程中能够插入切面的一个点。

    • 切点: 切点定义了切面在何处要织入的一个或者多个连接点。
    • 切面:是通知和切点的结合。通知和切点共同定义了切面的全部内容。
    • 引入:引入允许我们向现有类添加新方法或属性。
    • 织入:是把切面应用到目标对象,并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入: 
      • 编译期: 在目标类编译时,切面被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
      • 类加载期:切面在目标加载到JVM时被织入。这种方式需要特殊的类加载器(class loader)它可以在目标类被引入应用之前增强该目标类的字节码。
      • 运行期: 切面在应用运行到某个时刻时被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面的。

Spring AOP配置简单记录(注解及xml配置方式)的更多相关文章

  1. Spring基础篇——通过Java注解和XML配置装配bean

    自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...

  2. Spring基础篇——通过Java注解和XML配置装配bean(转载)

      作者:陈本布衣 出处:http://www.cnblogs.com/chenbenbuyi 本文版权归作者和博客园共有,欢迎转载分享,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留 ...

  3. [spring]Bean注入——使用注解代替xml配置

    使用注解编程,主要是为了替代xml文件,使开发更加快速. 一.使用注解前提: <?xml version="1.0" encoding="UTF-8"?& ...

  4. Spring使用AspectJ注解和XML配置实现AOP

    本文演示的是Spring中使用AspectJ注解和XML配置两种方式实现AOP 下面是使用AspectJ注解实现AOP的Java Project首先是位于classpath下的applicationC ...

  5. aop的简单使用(代码和配置记录)

    Spring aop 简单示例 简单的记录一下spring aop的一个示例 基于两种配置方式: 基于xml配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出 ...

  6. Spring AOP进行日志记录,管理

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  7. Spring AOP进行日志记录

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  8. mybatis使用注解替代xml配置,动态生成Sql

    mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...

  9. Spring Boot 2.X(八):Spring AOP 实现简单的日志切面

    AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...

随机推荐

  1. codeforces 570 E. Pig and Palindromes (DP)

    题目链接: 570 E. Pig and Palindromes 题目描述: 有一个n*m的矩阵,每个小格子里面都有一个字母.Peppa the Pig想要从(1,1)到(n, m).因为Peppa ...

  2. F - Function

    Bryce1010模板 先找到数组A中的循环节,再找到数组B中的循环节,如果B中的循环节是A中循环节的循环因子,说明可以配对,结果累积起来. #include<bits/stdc++.h> ...

  3. Oracle10g安装过程中ORA-27125问题解决

    Oracle10g在CentOS7的安装过程中报错如下错误信息: ORA-: unable to create shared memory segment 解决办法: [root@dbsrv3 dat ...

  4. 二进制流BinaryFormatter存储读取数据的细节测试

    二进制流的使用很方便,为了更好的理解应用它,我创建简单对象开始测试它的增加特性和减少特性. [Serializable] class Data----------开始时候的存储对象 { public ...

  5. Java socket1

    注意: 网络编程不是等于网站编程.  html css JavaScript那些是网站编程,是构建在网络编程的基础之上的,网络编程是它的底层.    比方说qq,联动的游戏,这些是网络编程. 一般的网 ...

  6. Android插件开发

    插件开发的概念: 对于一个功能特别多,代码量特别大的App比如支付宝.360手机助手来说,如果把所有的功能和代码都写在一个App中,就会造成App体积过于庞大,用户下载体验差,不方便测试,业务.模块耦 ...

  7. Solr中的group与facet的区别 [转]

    Solr中的group与facet的区别 facet 自己理解就是分组聚合用的, 如下说明 http://blog.csdn.net/a925907195/article/details/472572 ...

  8. .NET 几种数据绑定控件的区别

    GridView 控件 GridView 控件以表的形式显示数据,并提供对列进行排序.分页.翻阅数据以及编辑或删除单个记录的功能. 特征:一行一条记录,就像新闻列表一样:带分页功能. DataList ...

  9. 自制无线共享工具C++源代码及创建过程

    // wire.cpp : 定义控制台应用程序的入口点.// #include <iostream>#include <string.h>using namespace std ...

  10. Record these plug-ins of vscode

    实在无聊透顶.写个随笔记录一下vscode的插件好了. 第一次使用(之前一直在用sublime...),以后再更新吧.record my color too! Visual Studio Code B ...