概念
- Aspect Oriented Programming 面向切面编程
- 预编译,运行期间,动态代理技术,解耦
AOP的动态代理技术
- JDK代理:接口
- cglib:父类
spring的AOP
- 是对JDK代理和cglib代理的封装
- jdk代理是原生的,速度快,但是需要接口的支持
- cglib是第三方的,不需要接口
相关概念(词汇)
- Target 目标对象,承载了连接点
- Proxy 代理对象,承载了通知(增强方法)
- joinpoint 可以被增强的方法
- pointcut 被增强的方法
- advice 通知/增强 ,增强方法的逻辑
- aspect 切面 (切点+增强/通知)
- weaving 织入 切点和通知结合的过程
AOP开发的三步曲
- 目标方法 目标对象
- 增强方法 代理对象
- 配置结合
Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
XML的AOP开发
- 导入AOP 坐标 context, aspectjweaver
- 目标类和目标接口
- 切面类(有增强方法)
- 目标对象和切面对象放入spring容器中
- appllicationContext.xml中配置织入关系
- 测试
切点表达式
- execution([修饰符] 返回值类型 包名.类名 .方法名(参数))
- 修饰符可以省略
- 返回值类型、包名、类名、方法名可以使用星号* 代表任意
- 包名与类名之间两个点 … 表示当前包及其子包下的类
- 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表
通知的类型
- aop:before
- aop:after-returning
- aop:around
- aop:throwing
- aop:after
切点表达式的抽取
```java
<aop:pointcut id="myPointcut" expression="execution(* com.itheima.aop.*.*(..))"/>
pointcut-ref="myPointcut"
@Pointcut("execution(* com.itheima.anno.*.*(..))")
public void pointcut(){}
```
植入的配置
<aop:config>
<aop:aspect ref=“切面类”>
<aop:before method=“通知方法名称” pointcut=“切点表达式"></aop:before>
</aop:aspect>
</aop:config>
注解的AOP配置
开发的步骤
-
创建目标类和目标接口
-
创建切面类
-
将目标和切面对象放入spring容器中
-
注解配置植入关系
-
配置文件中开启扫描和AOP的自动代理
-
测试
-
动态代理的实现过程
public interface TargetInterface {
public void method();
}
public class Target implements TargetInterface {
@Override
public void method() {
System.out.println("i`m target method ...");
}
}
public class ProxyDemo {
public static void main(String[] args) {
final Target target = new Target();
TargetInterface proxy = (TargetInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler