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. SQL Server 问题之 排序规则(collation)冲突

    一.写在前面 最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有Database(现有服务器Windows Server 2003 + SQL Ser ...

  2. centos7 部署镜像仓库 harbor

    =============================================== 2018/4/16_第2次修改                       ccb_warlock 更新 ...

  3. java基础29 迭代器 listIterator() 及各种遍历集合的方法

    listIterator() 迭代器包含了 Iterator() 迭代器中的所有方法. 1.ListIterator的常用方法 hasPrevious() :判断是否还有上一个元素,有则返回true  ...

  4. 编译环境搭建:Makefile

    前言 长久以来,笔者一直想用一种管理工具,将所编写的测试程序.算法代码以及工程代码统一管理起来.因为有些是用Java写的有些是用C++写的.虽有想法,但却无行动.这又让我想起了昨天晚上看到一部电影里所 ...

  5. Linux学习笔记:ps -ef、ps aux、kill -9

    一.查看进程命令 1.ps命令 Linux中的ps命令是Process Status的缩写. ps命令用来列出系统中当前运行的那些进程. ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻 ...

  6. Python练手之爬虫

    很久没更新博客了,最近自学Python,写个在百度上爬算法题题解的爬虫,第一次写爬虫..纯当练手 慢慢来.. #coding:utf-8 ''' Created on 2016年11月22日 @aut ...

  7. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. sublime text配置make工具

    sublime text配置make工具 Linux下许多项目是用makefile来管理的,是用gcc+make等方式来编译和运行. 在只有tty的场合或年代,使用vim或emacs是不二选择:但在L ...

  9. hdu 1007 N个点中输出2点的最小距离的一半

    分治法 Sample Input20 01 121 11 13-1.5 00 00 1.50 Sample Output0.710.000.75 # include <iostream> ...

  10. day1作业:编写登录窗口一个文件实现

    思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则: 1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用户是否被锁定,然后在 ...