五、面向切面:AOP
AOP:指不改变源代码的情况下增强功能或方法
5.1 场景模拟
写一个计算器
搭建子模块:spring6-aop
5.1.1 声明接口
声明计算器接口 Calculator ,包含加减乘除的抽象方法
Calculator.java
package com.atguigu.example;public interface Calculator {//加int add(int i, int j);//减int sub(int i, int j);//乘int mul(int i, int j);//除int div(int i, int j);
}
5.1.2 创建实现类
CalculatorImpl.java
package com.atguigu.example;//基本实现类
public class CalculatorImpl implements Calculator {@Overridepublic int add(int i, int j) {int result = i+j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int sub(int i, int j) {int result = i-j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int mul(int i, int j) {int result = i*j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int div(int i, int j) {int result = i/j;System.out.println("方法内部 result = " + result);return result;}
}
5.1.3 创建带日志功能的实现类
CalculatorLogImpl.java
package com.atguigu.example;//带日志的实现类
public class CalculatorLogImpl implements Calculator{@Overridepublic int add(int i, int j) {System.out.println("[日志] add 方法开始了,参数是:" + i + "," + j);int result = i+j;System.out.println("方法内部 result = " + result);System.out.println("[日志] add 方法结束了,结构是:" + result);return result;}@Overridepublic int sub(int i, int j) {System.out.println("[日志] sub 方法开始了,参数是:" + i + "," + j);int result = i-j;System.out.println("方法内部 result = " + result);System.out.println("[日志] sub 方法结束了,结构是:" + result);return result;}@Overridepublic int mul(int i, int j) {System.out.println("[日志] mul 方法开始了,参数是:" + i + "," + j);int result = i*j;System.out.println("方法内部 result = " + result);System.out.println("[日志] mul 方法结束了,结构是:" + result);return result;}@Overridepublic int div(int i, int j) {System.out.println("[日志] div 方法开始了,参数是:" + i + "," + j);int result = i/j;System.out.println("方法内部 result = " + result);System.out.println("[日志] div 方法结束了,结构是:" + result);return result;}
}
5.1.4 提出问题
5.2 代理模式
5.2.1 概念
5.2.2 静态代理
5.2.3 动态代理
5.2.4 测试
5.3 AOP 概念及相关术语
AOP 的底层用到了动态代理