Spring——AOP
创始人
2024-03-23 05:23:00
0

Spring中的可插拔组件技术

在这里插入图片描述

Spring AOP

  • Spring AOP——Aspect Oriented Programming 面向切面编程
  • AOP 的做法是将通用的、与业务无关的功能抽象封装为切面层
  • 切面可配置在目标方法执行前后,做到即插即用

不修改源码对程序功能进行拓展

AoP的关键概念

Spring AoP 与AspectJ的关系

  • Eclipse AspectJ,一种基于Java平台的面向切面编程的语言
  • Spring AoP 使用AspectJWeaver 实现 类与方法匹配
  • Spring AOP 利用代理模式实现对象运行时功能拓展

几个重要概念
在这里插入图片描述

AOP配置过程

  1. 依赖AaspectJ
  2. 实现切面类和方法
  3. 配置Aspect Bean
  4. 定义PointCut
  5. 配置Aadvice

JoinPoint核心方法

注解说明
Object getTarget()获取IoC容器内目标对象
Signature getSignature()获取目标方法
Object[] getArgs()获取目标方法参数

PointCut 切点表达式

在这里插入图片描述

五种通知类型

在这里插入图片描述
xml配置如下:

 

利用AOP 进行方法性能筛查

applicationContext.xml:




methodChecker:

package com.imooc.spring.aop.aspect;import org.aspectj.lang.ProceedingJoinPoint;import java.text.SimpleDateFormat;
import java.util.Date;/*** todo {类简要说明}** @Author wangw* @Date 2022/12/1 22:59* @Version 1.0*/
public class MethodChecker {// proceedingJoinPoint是原有JoinPoint的升级,在原有功能基础上,还能控制目标方法是否执行public Object check(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {try {long startTime = System.currentTimeMillis();Object ret =  proceedingJoinPoint.proceed();long endTime = System.currentTimeMillis();long duration =endTime-startTime;if (duration>=1000){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss SSS");String className = proceedingJoinPoint.getTarget().getClass().getName();String methodName =proceedingJoinPoint.getSignature().getName();Object[] args =proceedingJoinPoint.getArgs();String now = sdf.format(new Date());System.out.println("======"+now+":"+className+"."+methodName+"."+"("+duration+")ms==============");}return ret;} catch (Throwable e) {throw e;}}
}

基于注解开发SpringAOP

在这里插入图片描述
在这里插入图片描述

Spring AOP 实现原理

  • Spring 基于代理模式实现动态功能拓展,包含两种形式
  • 目标类拥有接口,通过JDK动态代理实现功能拓展
  • 目标类没有接口,通过CGLib实现功能拓展

代理模式

  • 代理模式通过代理对象对原对象实现功能拓展

在这里插入图片描述

(静态代理 是指必须手动创建按代理类的代理模式使用方式)

JDK动态代理

    private Object targetObj;public ProxyInvocationHandle(Object targetObj){this.targetObj =targetObj;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("前置执行方法");Object ret = method.invoke(targetObj,args);System.out.println("后置方法");return ret;}public static void main(String[] args) {UserService userService  = new UserServiceImpl();ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle(userService);UserService userServiceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),proxyInvocationHandle);userServiceProxy.createUser();EmployeeService employeeService =new EmployeeServiceImpl();ProxyInvocationHandle proxyInvocationHandleProxy = new ProxyInvocationHandle(employeeService);EmployeeService employeeServiceProxy = (EmployeeService) Proxy.newProxyInstance(employeeService.getClass().getClassLoader(),employeeService.getClass().getInterfaces(),proxyInvocationHandleProxy);employeeServiceProxy.say();}
public interface EmployeeService {public void createNewEmployee();
}
public class EmployeeServiceImpl implements EmployeeService{public void say() {System.out.println("hello");}
}

CGLib

使用代理时如果没有接口,则使用CGLib
在这里插入图片描述

AOP 底层就是使用动态代理实现的!!!

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...