0. aop的相关术语
1. aop 的操作准备
2.使用表达式配置切入点
3.aop的前置/后置/环绕 增强的实现
AOP:扩展某个类A的方法时,不需要通过继承重写。而是创建另一个类B,用B的方法加在A的方法上。
0. aop 的相关术语
aop的作用:A类中的某方法需要扩展功能时,可以通过B类的某方法扩展,即把B类的某方法加入到A类的某方法中。
(1)连接点(Joinpoint)
表示程序执行到的某个特定位置,在Spring中表示某个(类的方法)。每个程序类都有多个连接点,如一个拥有2个方法的类,即拥有了2个连接点
(2)通知/增强
增强的逻辑称为增强。比如扩展日志功能,这个日志功能称为增强
增强有几种:
前置通知/增强:在方法之前执行
后置通知/增强:在方法之后执行
异常通知/增强:方法出现异常时执行
最终通知/增强:在后置之后执行
环绕通知/增强:在方法之前和之后执行
(3)切点
类中可以有多个方法可以被增强,而实际增强的方法 为切入点
(4)切面
把增强应用到具体方法上面,过程称为切面。
1. aop 操作准备
(1).除了有基本的 spring jar包外,还需要导入 aop 相关的 jar包
(2).在配置文件中导入 aop 约束
同样也是在 spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 中寻找:
在 xsd-configuration 中 查找 标题:the aop schema ,红框处就是要使用的约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
</beans>
接着:
即可完成 aop 操作的准备工作
2.使用表达式配置切入点
切入点:实际增强的方法
常用的表达式:
execution(<访问修饰符> <返回类型><方法名>(参数)<异常>)
访问修饰符:如public,private 等,可以用 * 表示所有修饰符。
若要增强 com.zje 包中Book类中的 fun()方法,有以下几种常用写法:
(1)execution(* com.zje.Book.fun(..))//fun(..) 中的 .. 表示方法的参数。
(2)execution(* com.zje.Book.*(..))//增强com.zje.Book 中的所有方法
(3)execution(* *.*(..))//增强所有类中的所有方法
3.aop的 前置/后置/环绕 增强的实现:
目录树:
1.Book.java(需要被增强的类)
package com.zje;
public class Book {
/*连接点(被增强时为切入点)*/
public void fun(){
System.out.println("fun......");
}
}
2.MyBook.java(用于增强Book类的类)
package com.zje;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyBook {
/*前置增强*/
public void before1(){
System.out.println("前置增强......");
}
/*后置增强*/
public void after1(){
System.out.println("后置增强.......");
}
/*环绕增强*/
//ProceedingJoinPoint 表示切入点
public void around1(ProceedingJoinPoint pjd) throws Throwable{
System.out.println("环绕增强-----方法之前"); //被增强方法(切入点)运行之前所运行的代码
pjd.proceed(); //运行被增强方法(切入点)
System.out.println("环绕增强-----方法之后"); //被增强方法(切入点)运行之后所运行的代码
}
}
3.Bean1.xml:
如上图所示,编写 aop 操作:
1.配置切入点和增强的对象
2.配置切入点:制定切入点,并起一个切入点的id
3.配置切面:制定是前置?后置?还是环绕增强
运行结果: