[b]AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。[/b]
切面:
横切关注点被模块化为特殊的类,这些类称为切面
优点:
每个关注点现在都集中于一处,而不是分散到多处代码中
服务模块更简洁,服务模块只需关注核心代码。
AOP 术语
[color=red]通知:[/color]
定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。
工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。
Spring 切面可应用的 5 种通知类型:
Before——在方法调用之前调用通知
After——在方法完成之后调用通知,无论方法执行成功与否
After-returning——在方法执行成功之后调用通知
After-throwing——在方法抛出异常后进行通知
Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
[color=red]连接点:[/color]
定义:连接点是一个应用执行过程中能够插入一个切面的点。
连接点可以是调用方法时、抛出异常时、甚至修改字段时、
切面代码可以利用这些点插入到应用的正规流程中
程序执行过程中能够应用通知的所有点。
[color=red]切点: [/color]
定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。
通常使用明确的类或者方法来指定这些切点。
作用:定义通知被应用的位置(在哪些连接点)
[color=red]切面:[/color]
定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。
[color=red]引入:[/color]
引入允许我们向现有的类中添加方法或属性
[color=red]织入: [/color]
织入是将切面应用到目标对象来创建的代理对象过程。
切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入
编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。
类加载期——切面在类加载到
JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式
运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。
切面:
横切关注点被模块化为特殊的类,这些类称为切面
优点:
每个关注点现在都集中于一处,而不是分散到多处代码中
服务模块更简洁,服务模块只需关注核心代码。
AOP 术语
[color=red]通知:[/color]
定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。
工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。
Spring 切面可应用的 5 种通知类型:
Before——在方法调用之前调用通知
After——在方法完成之后调用通知,无论方法执行成功与否
After-returning——在方法执行成功之后调用通知
After-throwing——在方法抛出异常后进行通知
Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
[color=red]连接点:[/color]
定义:连接点是一个应用执行过程中能够插入一个切面的点。
连接点可以是调用方法时、抛出异常时、甚至修改字段时、
切面代码可以利用这些点插入到应用的正规流程中
程序执行过程中能够应用通知的所有点。
[color=red]切点: [/color]
定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。
通常使用明确的类或者方法来指定这些切点。
作用:定义通知被应用的位置(在哪些连接点)
[color=red]切面:[/color]
定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。
[color=red]引入:[/color]
引入允许我们向现有的类中添加方法或属性
[color=red]织入: [/color]
织入是将切面应用到目标对象来创建的代理对象过程。
切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入
编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。
类加载期——切面在类加载到
JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式
运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。
<context:component-scan base-package="com.seki.aop" />
<aop:aspectj-autoproxy/>
@Service
public class Performer {
public void perform(String s1, String s2){
System.out.println("------wait aop------");
}
}
@Component
@Aspect
public class Audience {
@Pointcut("execution(* com.seki.service.Performer.perform(..))&& args(s1,s2)")
public void performance(String s1,String s2){}
@Around("performance(s1,s2)")
public void watchPerformance(ProceedingJoinPoint joinPoint,String s1,String s2){
try {
System.out.println("------begin aop-----");
Object obj[] = joinPoint.getArgs();
for(Object o :obj){
System.out.println(o);
}
System.out.println(s1);
System.out.println(s2);
joinPoint.proceed();
System.out.println("------end aop-----");
} catch (Throwable e) {
e.printStackTrace();
}
}
}