什么是AOP
AOP通常叫面向切面编程(Aspect-oriented Programming,简称AOP),它是一种编程范式,通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。
通常用来对隔离不同业务逻辑,比如常见的事务管理、日志管理等。同时实现AOP的方式也有两种:cglib 以及 jdk两种方式来实现。
为什么要用AOP
假设现在有几个实现方法,需要做日志处理,正常来说我们只需要手动添加一下日志就可以了,我们都知道在真正的业务代码中,代码行数,以及方法数那是一个天文数字,如果都要手动添加那工作量不现实。
本着作为程序员因该想着怎么合理的偷懒的习惯,所以应该想办法提高效率。
AOP因此就产生了,说白了AOP就是通过某种匹配规则去匹配方法,然后再添加对应的日志处理。而AOP本身的实现方式就是通过ASM字节码框架动态生成技术,在程序运行的时候,根据需求(添加文件)动态创建字节码文件,之前讲的设计模式-代理模式中也有讲到,大家可以去看一下。
AOP的核心概念
- 切面(Aspect):似于 Java 中的类声明,常用于应用中配置事务或者日志管理。一般使用 @Aspect 注解或者 aop:aspect 来定义一个切面。
- 连接点(Join Point):程序执行中的特定点,比如方法执行、处理一个异常等
- 切点(Pointcut):通过一种规则匹配的正则表达式,当有连接点可以匹配到切点时,就会触发改切点相关联的指定通知。
- 通知(Advice):在切面中某个连接点采取的动作,通知方式也有5种
- around(环绕通知):前后都加
- before(前置通知)
- after(后置通知)
- exception(异常通知)
- return(返回通知)
- 织入(Weaving):链接切面和目标对象创建一个通知对象的过程。
AOP其实就是一种编程思想,而这上面的这个点就是编程的具体实现规范。
一个应用中可以有多种通知方式所以在AOP中引入一种设计模式
责任链模式通过这这种模式来顺序执行每一个通知当然也可以使用@Order注解,配置数字越小,越先执行。
AOP的执行过程
- IOC容器启动,用来存放对象
- 进行对象的实例化和初始化操作,将生成的完成的对象存放到容器中(容器运行中的一些对象比如BeanFactoryProcesser、methodInterceptore等还有其他的很多对象)
- 从创建好的容器中获取需要对象
- 调用具体的方法开始调用
说了这么多理论知识,要想知道里面的具体执行流程,还是老样子,一步一步debug进入源码查看流程了
首先还是需要先准备配置一个切面
@Aspect
@Component
public class LogUtil {
@Pointcut("execution(public * com.ao.bing.demo.spring.aop..*.*(..))")
public void pctMethod() {
}
@Around(value = "pctMethod()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object ret = pjp.proceed();
System.out.println("Around advice");
return ret;
}
@Before("pctMethod()")
public void before() {
System.out.println("Before advice");
}
@After(value = "pctMethod()")
public void after() {
System.out.println("After advice");
}
@AfterReturning(value = "pctMethod()")
public void afterReturning() {
System.out.println("AfterReturning advice");
}
@AfterThrowing(value = "pctMethod()")
public void afterThrowing() {
System.out.println("AfterThrowing advice");
}
// mian方法测试demo
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
AopTestDemo aopTestDemo = applicationContext.