1、AOP概念
首先让我们从定义一些重要的AOP概念开始。这些术语不是Spring特有的。 不幸的是,Spring术语并不是特别的直观;如果Spring使用自己的术语,将会变得更加令人困惑。
· 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
例:每个方法都要加日志,以及到处都要处理事务..这都构成了一个方面.
· 通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
例:要执行的动作,如日志代码
· 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied) 对象。
例:等着被添加事务的业务层的一个类
· AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明.
例:代理,即将通知和目录对象整合。
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
2、通知的类型:(详见附件3)
前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
org.springframework.aop.MethodBeforeAdvice
后置通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
org.springframework.aop.AfterReturningAdvice
抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。
org.springframework.aop.ThrowsAdvice
环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
org.aopalliance.intercept.MethodInterceptor
通知(Advice)顺序
如果有多个通知想要在同一连接点运行会发生什么?Spring AOP 的执行通知的顺序跟AspectJ的一样。 在“进入”连接点的情况下,最高优先级的通知会先执行
3、Spring 2.0 "@AspectJ"使用了Java 5 ( AspectJ 5)的注解,可以将切面声明为普通的Java类。 使用了AspectJ 提供的一个库来做切点(pointcut)解析和匹配。 但是,AOP在运行时仍旧是纯的Spring AOP,并不依赖于AspectJ 的编译器或者织入器(weaver)。
spring 2.0引入了一个简单并且功能更加强大的方法来自定义aspect。自定义aspect时有两种风格:schema-based和@aspectJ。
1. @aspectJ风格指在一个正常的java类上添加java 5的注解来声明一个aspect,它是由AspectJ项目提出的,详细信息请查看http://www.eclipse.org/aspectj 。
见附件3
2. shcema-based风格是指在spring bean的配置文件中通过新的"aop"命名空间标记定义一个aspect。
见附件3
附@aspectJ风格:
@Aspect
public class Example {
@Before("execution(* com.xyz.myapp.dao.*.*(..))")
public void doAccessCheck() {
// ...
}
@AfterReturning(
pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
returning="retVal")
public void doAccessCheck(Object retVal) {
// ...
}
@AfterThrowing(
pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
throwing="ex")
public void doRecoveryActions(DataAccessException ex) {
// ...
}
@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doReleaseLock() {
// ...
}
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
}
分享到:
相关推荐
Spring,面向切面编程AOP例子!AOP(Aspect Oriented Programming)!
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。
Spring-aop面向切面编程实例 日志系统,权限控制等.
NULL 博文链接:https://countme.iteye.com/blog/1132555
关于Spring框架的aop简介
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring4AOP 面向切面编程实例之方法拦截实例 一下利用Spring4的最后一个版本Spring4.3.9,实现简单的方法拦截实例。 Eclipse 建立java工程,导入必要的jar包,工程目录如下:
一直对AOP面向切面编程的理解很模糊的同学可以看看。
NULL 博文链接:https://zyssnh.iteye.com/blog/1866867
2、面向切面编程AOP 在实现过程中,我尽量贴近实际开发与场景,麻雀虽小,五脏俱全,个人感觉这个项目是web框架搭建的一个极简之道实践。 项目中可能还存在很多的问题,希望大家不吝赐教,谢谢。
NULL 博文链接:https://cdxs2.iteye.com/blog/1942254
16.2 Spring框架-AOP面向切面编程
Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP).doc
主要介绍了Spring 面向切面编程AOP实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。AOP 采取横向抽取机制,取代了传统纵向继承...
该压缩包包含--学习笔记(05):轻松搞定Spring全家桶(初识篇)-面向切片编程AOP:--系列博客中新需要的三个jar包。包括spring-aspects-5.2.7.RELEASE.jar和spring-aop-5.2.7.RELEASE.jar和...
第十四章面向切面编程(SpringAOP)PPT文档.pptx
面向切面的编程(AOP)及在Spring中的应用
编程语言+JAVAspring+AOP编程+面向切面**:这是一个关于JAVAspring编程语言的AOP编程的面向切面的资源,适合有一定JAVAspring基础的开发者。它介绍了JAVAspring的AOP编程的概念、原理和作用,以及如何使用JAVAspring...
NULL 博文链接:https://cdxs2.iteye.com/blog/1942198