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. flask插件系列之flask_uploads上传文件

    前言 flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的. 安装 pip install flask_uploads 基本使用 # e ...

  2. device tree --- #address-cells and #size-cells property【转】

    转自:http://www.cnblogs.com/youchihwang/p/7050846.html device tree source Example1 / { #address-cells ...

  3. 做了这么久的 DBA,你真的认识 MySQL 数据安全体系?【转】

    给大家分享下有关MySQL在数据安全的话题,怎么通过一些配置来保证数据安全以及保证数据的存储落地是安全的. 我是在2014年加入陌陌,2015年加入去哪儿网,做MySQL的运维,包括自动化的开发. 接 ...

  4. 超简单的qps统计方法(推荐)【转】

    统计最近N秒内的QPS值(包括每秒select,insert等值) mysql> select variable_name,sum(per_sec) as qps from (select st ...

  5. 如何使用vs2012单步调试uGUI(unity3d 5.3f4)

    下载uGUI源代码 uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 下载代码工具:tortoisehg-3.6.2-x64.msi http ...

  6. 使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8

    =============================================== 2018/3/22_第2次修改                       ccb_warlock 更新 ...

  7. linux快速安装mysql教程

    #安装mysql服务器:yum install mysql-server #设置开机启动chkconfig mysqld on#现在启动服务service mysqld start #设置root初始 ...

  8. Oracle 函数 “申请通过后,将该表中循环遍历到的所有内容插到另一个表中”

    create or replace function mcode_apply_insert_material(p_mca_no VARCHAR2, p_action VARCHAR2, p_wf_no ...

  9. 移动端,PC端,微信等常用平台和浏览器判断

    var wzw={ //浏览器相关信息 //android webview 需要app进行支持,Android web view初始化时,在navigator中添加标识 browser:{ versi ...

  10. 组件化表单解决方案AForm 1.3 发布

    v1.3 更新日志 输入控件的实现改为实例化模式,同类型多个输入控件在同一个表单不会冲突 输入控件实现了继承 可以使用AForm.create创建表单,和使用new AForm创建实例的参数和结果一样 ...