一.什么是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(来自百度)
二.Spring动态代理之CGLIB示例
public class CglibProxy {
public static void main(String[] args) {
UserService service = new UserService();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object target, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before invoke method");
Object result = method.invoke(target, method);
System.out.println("after invoke method");
return result;
}
});
UserService proxy = (UserService) enhancer.create();
proxy.sayHello("诶嘿~");
}
}
三.Spring AOP 相关概念
Spring 的 AOP 实现底层就是对上面的动态代理的代码进行封装
封装后我们只需要对关注的部分进行代码遍历,并通过配置的方式完成指定目标的方法增强
上面通过手工创建的代理类的方式只能增强一个类;对于增强一批类,包括多个包下面的类的时候,就显得不够用了;同时还需要一定的过滤能力来标识出那些带有某些特征的方法才参与到AOP逻辑中,因此我们需要更加强大的能力来实现真正的AOP
- Target(目标对象):需要进行增强的目标对象
- Proxy(代理):目标对象的类被 AOP 织入增强后产生的代理类
- JoinPoint(连接点):所谓连接点是指那些被拦截到的点。在 Spring 中这些点指的是方法,因为 Spring 只支持方法类型的连接点
- Pointcut(切入点):所谓切入点是指我们需要对哪些 JoinPoint 进行拦截的定义
- Advice(增强逻辑):当拦截到 JoinPoint 之后想增强的逻辑块
- Aspect(切面):把 Pointcut 和 Advice 结合起来的一组配置
四.Spring AOP AspectJ 实现
@Component
@Aspect
public class LogAspect {
@Pointcut("execution(public * com.shop.biz.service.*.*(..))")
public void logging(){}
@Around("logging()")
public Object run(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("input args:" + Arrays.toString(joinPoint.getArgs()));
Object result = joinPoint.proceed();
System.out.println("result" + result);
return result;
}
}
注解说明
- @Aspect:标识切面类
- @Pointcut:定义切入点
- @Around:定义通知类型
Pointcut 语法
- execution:支持表达式
- @within:支持类注解
- @annotation:支持方法注解
Advice 类型
- @Before:方法执行之前
- @After:方法执行之后
- @AfterReturning:方法正常执行之后
- @AfterThrowing:异常抛出之后
- @Around:环绕,可以在源方法前后增加逻辑,甚至可以选择不执行源方法
本文章整理自上课PPT,仅供学习使用。