AOP简介
-
AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.。
-
AOP 的主要编程对象是 切面(aspect), 而切面模块化横切关注点.。
-
在应用 AOP 编程时, 仍然需要定义通用的系统功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里。
AOP的优点:
-
- 日志记录的代码和真正的业务逻辑代码进行代码分离
- 通用的系统功能(日志记录、权限校验)进行了高度的模块化
- 业务逻辑的功能变的更简洁,仅仅包含业务逻辑的代码
- AOP可以将系统功能(日志记录)与业务逻辑功能搅和到一起执行
AOP 中的专业术语
- 切面(aspect):横切逻辑被模块化的特殊对象。即它是一个类 :如LogAspect
- 通知(advice):切面中必须完成的工作。即它是类中的一个方法:如writeLog()
- 目标类(target):被通知增强的对象
- 代理类(proxy):向目标类应用通知增强之后产生的对象
- 切入点(pointcut):切面中通知执行的“地点”的定义
- 连接点(JoinPoint): 与切入点匹配的执行点:如目标类中的所有方法getUserId()
AOP的两种底层实现方式
代理:
代理设计模式的原理: 使用一个代理对象将原始对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理对象. 代理对象决定是否以及何时将方法调用转到原始对象上。
-
-
- 静态代理:
-
为每一个目标对象创建一个代理实现类的方式可以认为就是静态代理。
静态代理的实现很简单,但是会造成代理类的快速膨胀,每一个目标类,都需要创建一个代理类
1 //静态代理 2 public class StaticProxyUserService implements UserService { 3 //原始对象 4 private UserService userService; 5 6 public StaticProxyUserService(UserService userService) { 7 this.userService = userService; 8 } 9 @Override 10 public User getById(String userId) { 11 System.out.println("执行权限校验,日志记录......."); 12 return userService.getById(userId); 13 } 14 @Override 15 public boolean add(User user) { 16 System.out.println("执行权限校验,日志记录......."); 17 return userService.add(user); 18 } 19 20 @Override 21 public boolean delete(String userId) { 22 System.out.println("执行权限校验,日志记录......."); 23 return userService.delete(userId); 24 } 25 @Override 26 public boolean update(User user) {