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. 解决 Electron 包下载太慢问题

    项目下新建 .npmrc 文件,加入如下配置: electron_mirror=https://npm.taobao.org/mirrors/electron/ 即使用淘宝的源,重新 npm inst ...

  2. 怎么看innodb的B+TREE层数?

    怎么看innodb的B+TREE层数?,下面以sysbench_testdata.sbtest2为例查看索引层数: - 查看相关系统 root@localhost [sysbench_testdata ...

  3. avalonJS-源码阅读(三) VMODEL

    avalon的重头戏.终于要到我最期待的vmodel了. ps:这篇博文想做的全一点,错误少一点,所以会有后续的更新在这篇文章中. 状态:一稿 目录[-] avalon dom小结 数据结构 观察者模 ...

  4. 【转】WCF光芒下的Web Service

    WCF光芒下的Web Service 学习.NET的开发人员,在WCF的光芒照耀下,Web Service 似乎快要被人遗忘了.因为身边做技术的人一开口就是WCF多么的牛逼!废话不多,本人很久不写博客 ...

  5. 大数据系列之数据仓库Hive中分区Partition如何使用

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  6. Tomcat实现多域名之间session共享

    最近启用二级域名后,面临一个主域名与二级域名之间 session 不能共享的问题,带来的麻烦就是用户在主域名登陆,但由于二级域名 session 不能共享 ,因此无法进行登陆的操作,对一些功能有一些影 ...

  7. Eclipse中各种编码格式及设置

    操作系统:Windows 10(家庭中文版) Eclipse版本:Version: Oxygen.1a Release (4.7.1a) 刚看到一篇文章,里面介绍说Ascii.Unicode是编码,而 ...

  8. 美国部分科技公司创始及IPO信息

    作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...

  9. 删除git库中untracked files(未监控)的文件

    https://blog.csdn.net/ronnyjiang/article/details/53507306 在编译git库拉下来的代码时,往往会产生一些中间文件,这些文件我们根本不需要,尤其是 ...

  10. Spring MVC参数注入注意事项

    1.类参数名不能出现‘name’ 2.需提供默认的无参构造