什么是AOP?
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
专业术语
- 切入点
pointCut
- 在哪些类哪些方法上切入
- 通知
advice
- 在方法前后做什么
- 切面
aspect
- 切面=切入点+通知
- 在什么时机什么地方做什么
- 织入
weaving
- 切面加入对象创建代理对象的过程
execution 表达式
(* com.sample.service.impl .. *.*(..))
符号 | 解释 |
---|---|
() | 表达式主体 |
* | 返回值类型 |
com.sample.service.impl | 包名 |
.. | 当前包及其子包 |
* | 所有类 |
.*(..) | 所有方法 参数 |
那么上面表达式就可以解释为
com.sample.service.impl 包及子包下所有类的所有方法(返回值任意)
Demo
当我们明白了之后我们为我的 项目添加日志功能
package com.lu.qtools.log;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Aspect
/**
* 切面 log
*/
public class AopLog {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private ThreadLocal<Long> response = new ThreadLocal<>();
// 代理所有的方法
@Pointcut("execution(* com.lu.qtools.controller..*.*(..))")
public void aopWebLog(){
}
// 执行代理方法前
@Before("aopWebLog()")
public void before(JoinPoint joinPoint){
response.set(System.currentTimeMillis());
logger.info("before:" + joinPoint.getClass());
}
// 执行代理方法后
@AfterReturning(pointcut = "aopWebLog()",returning = "retObject")
public void after(Object retObject){
logger.info("response:"+retObject);
logger.info("spend:"+(System.currentTimeMillis()-response.get()));
}
}
注解解释
- @Before
- 切入点开始切入内容
- @After
- 在切入点结尾处切入内容
- @AfterReturning
- 在切入点(return)内容后切入内容用来处理返回值
- @Around
- 在切入点前后切入内容,并控制切入点自身内容
- @AfterThrowing
- 在处理当前切入内容部分抛出异常之后的处理逻辑
- @Aspect
- 标记切面类
- @Component
- 把切面类加入ICO容器中,让Spring进行管理