2.AOP中的术语1)AOP→Aspect Oriented Programing 面向切面编程
AOP采取横向抽取机制,取代传统纵向继承体系重复性代码,一般用于鉴权,事务管理,通知,日志记录等
SpringAop使用纯Java实现,不需要专门编译过程和类加载,在运行期通过代理方式向目标类织入增强代码
2)AOP底层原理即动态代理
动态代理分两种:JDK动态代理和cglib动态代理
JDK动态代理通过jdk完成,通过反射执行的,加载速度快,执行效率低,只能实现有实现接口的目标对象
cglib动态代理是通过asm技术生成相对应目标类的子类的字节码文件,加载速度慢,执行效率高,无论目标对象是否实现接口。
3.举例在idea中实现Joinpoint(连接点):指被拦截到的点.在Spring中,这些点指的是方法。
Pointcut(切入点):指对哪些Joinpoint进行拦截的定义。
Advice(通知/增强):通知是指拦截到Joinpoint之后所要做的事情就是通知(分前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能))。
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Fileld。
Target(目标对象):代理的目标对象。
Weaving(织入):是把增强应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而Aspect采用编译期织入和类装载织入。
Proxy(代理):一个类被AOP织入增强后,产生一个结果代理类
Aspect(切面):是切入点和通知(引介)的结合
1)创建一个接口和一个实现类
//接口
//UserService->目标对象
public interface UserService {
//未曾强的方法为连接点:JoinPoint
//已增强的方法叫做切入点:PointCut
public void add();
public void delete();
}
//实现类
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("添加");
}
@Override
public void delete() {
System.out.println("删除");
}
}
在pom.xml中导入相关依赖
org.springframework spring-context5.3.10 org.aspectj aspectjweaver1.9.6 junit junit4.13.2
2)创建MyAdvice类
//通知类,增强的方法:Advice
public class MyAdvice {
public void before(){ System.out.println("目标对象调用方法前执行");}
public void after(){
System.out.println("后置通知(最终通知),目标对象调用方法后执行,无论是否发生异常都执行");
}
public void after_returning(){
System.out.println("后置通知,目标对象调用方法后执行,发生异常不执行");
}
public void after_throwing(){
System.out.println("异常通知,发生异常执行");
}
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("环绕通知,目标对象调用方法之前");
joinPoint.proceed();
System.out.println("环绕通知,目标对象调用方法之后");
}
}
3)配置文件applicationContext.xml
4)测试类测试
public class SpringTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService =
(UserService) applicationContext.getBean("userService");
userService.add();
System.out.println("----------------------------------------");
userService.delete();
}
}
得到结果:



