6. AOP
6.1 什么是AOP编程?
6.2 实现方式:
6.3 装饰者模式与静态代理对比:
6.4 动态代理
7. aspectj(基于XML的AOP配置)
7.1 安装与xml约束
7.2 AccountServiceImpl 与 Logger
7.3 切入点表达式
7.4 spring 通知(前置、后置、环绕、异常、最终)
8. aspectj(基于注解的AOP配置)
@EnableAspectJAutoProxy 启用aop
@Aspect
@Pointcut("execution(* com.itheima.service.impl.*.*(..))")
@Before("pt1()")@AfterReturning("pt1()")@AfterThrowing("pt1()")@After("pt1()")@Around("pt1()")
6. AOP
6.1 什么是AOP编程?
AOP:面向切面编程,在不修改源代码的情况下给程序动态统一添加功能。在代码阶段实现分离关注,松耦合。然后在运行时将相关动作特征植入运行,从而改变程序的运行顺序,达到拦截或者增加功能的目的。
6.2 实现方式:
1.预编译方式(在编译期、类加载期织入),例如AspectJ(解析切入点表达式)
2.运行期使用动态代理,例如Spring AOP分为jdk代理和CGLIB代理两种方式
6.3 装饰者模式与静态代理对比:
装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;(增强,传入对象)
代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;(控制,new class)
6.4 动态代理
特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
分类:1.基于接口的动态代理 Proxy.newProxyInstance (代理对象必须实现1个接口)
2.基于子类的动态代理 cglib
newProxyInstance()
@param1 ClassLoader:类加载器。用于加载代理对象字节码的。和被代理对象使用相同的类加载器
@param2 Class[]:字节码数组:它是用于让代理对象和被代理对象有相同方法
@param3 InvocationHandler:用于提供增强的代码。通常情况下都是匿名内部类(java中匿名内部类参数必须为final类型。局部变量的生命周期与局部内部类的对象的生命周期的不一致性!)
7. aspectj(基于XML的AOP配置)
AspectJ 是一个代码生成工具(Code Generator)
AspectJ 语法就是用来定义代码生成规则的语法
AspectJ 有自己的语法编译工具,编译的结果是 Java Class 文件,运行的时候,classpath 需要包含 AspectJ 的一个 jar 文件(Runtime lib)
7.1 安装与xml约束
7.2 AccountServiceImpl 与 Logger
7.3 切入点表达式
<aop:before method="beforePrintLog"
// 切入点表达式: execution(表达式)
// 访问修饰符(可省略)
// 返回值(*代表所有类型)
// 包名.包名.包名...类名.方法名(参数列表)(..表示当前包及其子包)
// 参数列表(..表示有无参数均可)
// 全通配写法: * *..*.*(..)
pointcut="execution(public void com.liuming.service.impl.AccountServiceImpl.saveAccount())"></aop:before>
7.4 spring 通知(前置、后置、环绕、异常、最终)
aop:config标签表明开始AOP的配置
aop:aspect标签表明配置切面
动态代理的环绕通知有明确的切入点方法调用invoke(),而我们的代码没有。Spring框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点方法.
8. aspectj(基于注解的AOP配置)
@EnableAspectJAutoProxy 启用aop
网友评论