AOP的核心概念

AOP(Aspect-Oriented Programming)面向切面编程可以实现横切点与他们所影响的对象之间的解耦。如将公共的日志、权限、事务等业务隔离出来,但不影响原来程序的逻辑性,提高了程序的可重用性,提高了开发效率等。

Aop常用术语:

  1. 通知:切面的工作

    • 前置通知(Before):在目标方法前执行自定义行为。
    • 后置通知(After):在目标方法后执行自定义行为。
    • 返回通知(After-returning):在目标方法执行后执行自定义行为。
    • 异常通知(After-throwing):在目标方法抛出异常后执行自定义行为。
    • 环绕通知(Around): 在目标方法调用前和调用后都执行自定义行为。
  2. 连接点:所有使用通知的应用。
  3. 切点:所有使用通知的方法。
  4. 切面:通知和切点的结合。
  5. 引入:向现有的类添加新方法或属性。
  6. 织入:把切面应用到目标对象并创建新的代理对象的过程。织入点可分为:
    • 编译期:在编译时织入,需要特殊的编译器。
    • 类加载期:在目标类加载到JVM时织入,需要特殊的类加载器。
    • 运行期:应用运行时织入,AOP容器为目标对象动态创建一个代理对象。SpringAOP以这种方式工作。

AOP注解

  • @Aspcet:定义一个切面
  • @PointCut:定义一个切点
  • @DeclareParents:以透明的方式为被通知的对象引入额外的接口
  • @Before:定义一个前置通知
  • @After:定义一个后置通知
  • @Araound:定义一个环绕通知
  • @AfterReturning:定义一个返回通知
  • @AfterThrowing:定义一个异常通知
  • @EnableAspectJAutoProxy:启动AspectJ自动代理

栗子:

@Aspect
public class AspectDemo{ @PointCut("execution(* 方法名(..))")
public void test(){} @Before("test()")
public void before() { } @After("test()")
public void after() { } } @Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AspectConfig { @Bean
public AspectDemo() {
return new AspectDemo();
} }

AOP的XML命名空间

  • aop:advisor:定义一个通知器
  • aop:after:定义一个后置通知
  • aop:after-returning:定义一个返回通知
  • aop:after-throwing:定义一个异常通知
  • aop:around:定义一个环绕通知
  • aop:aspect:定义一个切面
  • aop:aspectj-autoproxy:启用@AspectJ注解驱动的切面
  • aop:before:定义一个前置通知
  • aop:config:顶层aop配置元素,其他元素包含在这个元素中。
  • aop:declare-parents:以透明的方式为被通知的对象引入额外的接口
  • aop-poitcut:定义一个切点

栗子:

<aop-config>
<aop-aspect ref="bean的id">
<aop:before pointcut="execution(* 切点方法名(..))" method="前置通知方法名">
</aop:before>
<aop:after pointcut="execution(* 切点方法名(..))" method="后置通知方法名">
</aop:after>
</aop-aspect>
</aop-config>

Aspect指示器

在SpringAOP中使用Aspect的切点表达式语言来定义切点。

  • arg():限制连接点匹配参数为指定类型的执行方法
  • @arg():限制连接点匹配参数为指定注解标注的执行方法
  • execution():用于匹配连接点的执行方法
  • this():限制连接点匹配AOP代理的bean引用为指定类型的方法
  • target():限制连接点匹配目标对象为指定类型的方法
  • @target():同上用注解标注
  • within():限制连接点匹配指定类型
  • @within():同上用注解标注
  • @annoation():限制匹配带有指定注解的连接点
  • bean():匹配限定的bean的ID或者名称的连接点

execution(其他指示器都相同):

  • execution()方法可以使用正则表达式定义需要拦截的方法
  • 第一参数*表示返回任意类型
  • 第二个参数表示拦截的方法
  • 第三个参数(..)表示使用任意的参数

栗子:

@Before("execution(* 方法名(..))")
public void before(JoinPoint JoinPoint) {
} @After("@annotation(自定义接口名字)")
public void after(JoinPoint JoinPoint) { } @Around"@annotation(自定义接口名字)")
public void after(ProceedingJoinPoint proceedingJoinPoint) { }

Spring AOP笔记的更多相关文章

  1. spring aop 笔记2

    Aop面向切面编程 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关 注点的很好的例子.在Spring AOP中,切面可以使用基于模式) ...

  2. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  3. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  4. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  5. Spring4.0学习笔记(10) —— Spring AOP

    个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...

  6. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

  7. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  8. Spring AOP 整理笔记

    一.AOP概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 利用AOP可以对业务逻辑的各 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. 【环境变量】Linux 下三种方式设置环境变量与获取环境变量

    1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错误. 2.那么什么是环境变 ...

  2. asp.net操作word 配置在IIS上出现的问题

    异常: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问. (异常来自 ...

  3. Visual Studio 2017 for Mac

    Visual Studio 2017 for Mac Last Update: 2017/6/16 我们非常荣幸地宣布 Visual Studio 2017 for Mac 现已推出. Visual ...

  4. Scrapy:运行爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...

  5. Shell编程学习1--基础了解

    "#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...

  6. gtk+学习笔记(四)

    今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...

  7. 一步一步学习IdentityServer4 (3)自定登录界面并实现业务登录操作

    IdentityServer4 相对 IdentityServer3 在界面上要简单一些,拷贝demo基本就能搞定,做样式修改就行了 之前的文章已经有登录Idr4服务端操作了,新建了一个自己的站点 L ...

  8. 聊一聊FE面试那些事【原创】

    最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者的经历一样,在面试的过 ...

  9. 【51nod】1061 最复杂的数 V2

    题解 我是榜上最后一名= = 可能高精度用vector太慢了吧--什么破题= = 这道题很简单,如果高精度熟练代码--也很简单--然而,参数调了好久 我们发现质数的指数一定是,质数越小,指数越大,这个 ...

  10. gym 100531 三维几何+搜索

    精度有点毒, 其实可以不用double, 因为A, B必定在其中一个在三角形上,可以投影到只有x,y轴的地方叉积比较. #include<bits/stdc++.h> #define LL ...