Spring——AOP

news2024/9/22 19:36:23

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:config>
        <!-- pointcut 切点,使用excution表达式描述切面的作用范围-->
        <!-- execution(public * com.imooc..*.*(..))表达式说明切面作用在com.imooc包下的所有类的所有方法上 -->
        <aop:pointcut id="pointcut" expression="execution(public * com.imooc..*Service.*(..))"/>
        <aop:aspect ref="methodAspect">
            <!-- before 通知,代表在目标方法之前运行methodAspect.printExecutionTime-->
            <aop:before method="printExecutionTime" pointcut-ref="pointcut"/>

            <aop:after-returning method="doAfterReturning" returning="ret" pointcut-ref="pointcut"/>
            <aop:after method="doAfter" pointcut-ref="pointcut"/>
            <aop:after-throwing method="doAfterThrowing" throwing="exception" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>

利用AOP 进行方法性能筛查

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="userDao" class="com.imooc.spring.aop.dao.UserDao"/>
    <bean id="employeeDao" class="com.imooc.spring.aop.dao.EmployeeDao"/>
    <bean id="userService" class="com.imooc.spring.aop.service.UserService">
        <property name="userDao" ref="userDao"/>
    </bean>
    <bean id="employeeService" class="com.imooc.spring.aop.service.EmployeeService">
        <property name="employeeDao" ref="employeeDao"/>
    </bean>

    <!--<bean id="methodAspect" class="com.imooc.spring.aop.aspect.MethodAspect"></bean>
    <aop:config>
        &lt;!&ndash; pointcut 切点,使用excution表达式描述切面的作用范围&ndash;&gt;
        &lt;!&ndash; execution(public * com.imooc..*.*(..))表达式说明切面作用在com.imooc包下的所有类的所有方法上 &ndash;&gt;
        <aop:pointcut id="pointcut" expression="execution(public * com.imooc..*Service.*(..))"/>
        <aop:aspect ref="methodAspect">
            &lt;!&ndash; before 通知,代表在目标方法之前运行methodAspect.printExecutionTime&ndash;&gt;
            <aop:before method="printExecutionTime" pointcut-ref="pointcut"/>

            <aop:after-returning method="doAfterReturning" returning="ret" pointcut-ref="pointcut"/>
            <aop:after method="doAfter" pointcut-ref="pointcut"/>
            <aop:after-throwing method="doAfterThrowing" throwing="exception" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>-->
    <bean id="methodChecker" class="com.imooc.spring.aop.aspect.MethodChecker"/>
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.imooc..*.*(..))"/>

        <aop:aspect ref="methodChecker">
            <aop:around method="check" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

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 底层就是使用动态代理实现的!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈与队列3:有效的括号

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;20. 有效的括号 题目&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&am…

怎样才能批量查询网站的谷歌PR权重?把手教你批量查询网站谷歌PR权重值

谷歌PR是Google排名运算法则&#xff08;排名公式&#xff09;的一部分&#xff0c;用来标识网页的等级/重要性。在计算网站排名时&#xff0c;PageRank会将网站的外部链接数考虑进去。一个网站的外部链接数越多其PR值就越高&#xff1b;外部链接站点的级别越高&#xff0c;网站…

docker安装nginx代理nacos2.1.2版本集群

目录 安装docker最新版本 创建一个docker network&#xff0c;使之固定docker局域ip docker安装mysql主从 配置挂载的my.cnf配置文件 进入mysql主数据库容器命令 登录主数据库创建用于从数据连接主数据的账号密码 输入show master status;查看master数据库状态 在从数据库…

基于训练和推理场景下的MindStudio高精度对比

摘要&#xff1a;MindStudio提供精度比对功能&#xff0c;支持Vector比对能力。本文分享自华为云社区《【MindStudio训练营第一季】MindStudio 高精度对比随笔》&#xff0c;作者&#xff1a;Tianyi_Li。 训练场景下&#xff0c;迁移原始网络 (如TensorFlow、PyTorch) &#x…

[附源码]Python计算机毕业设计SSM家纺商品展示平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

连锁门店进销存软件的用途

门店式经营对于很多经营有道的老板来说是第一步&#xff0c;在规模扩张中&#xff0c;生意越做越大。这时要想拓宽销路&#xff0c;让收益更上一层楼&#xff0c;连锁、分店确实是一种行之有效的方法。 多门店管理经营存在的长久性难点是决策性工作量激增&#xff0c;管理方面…

[附源码]计算机毕业设计勤工俭学管理小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Multimodal Token Fusion for Vision Transformers

水平太浅&#xff0c;理解不到位。谨慎观看。 多模态token融合&#xff0c;我是语义分割&#xff0c;只看RGB和Depth模态。 1&#xff1a;作者为了解决transformer多输入的问题&#xff0c;对基于transformer视觉任务进行剪枝&#xff0c;为了有效的融合多模态&#xff0c;toke…

Docker(一) ----初始Docker

文章目录前言一、什么是 Docker1.1 Docker 的定义1.2 Docker对于上述问题的解决二、Docker 与虚拟机三、Docker 架构3.1 镜像和容器3.2 Docker 和 Docker Hub3.3 Docker 架构四、安装Docker4.1 卸载 (可选)4.2 安装Docker4.3 启动 Docker4.4 配置镜像加速总结前言 本文章主要是…

艾美捷肝细胞培养基试剂盒说明书

肝细胞培养基是专门为正常人类肝细胞体外培养设计的最适于其生长的培养基&#xff0c;是经灭菌的液体培养基&#xff0c;包含必需和非必需氨基酸、维生素、有机和无机化合物、激素、生长因子、微量矿物质和低浓度胎牛血清(5%)。 艾美捷肝细胞培养基试剂盒为我们的大鼠肝细胞设计…

WIN10商业版64位22H2正式版19045.2251MSDN11月原版镜像

微软表示 Windows 10 是迄今为止最好的 Windows 操作系统。无论你是普通办公用户、游戏玩家还是开发者&#xff0c;Win10 都能带给你目前最先进的功能特性以及使用体验。 其实微软对 Windows 10 版本的命名一直没有什么统一标准&#xff0c;最新的「22H2」是以开发代号命名的。…

【JavaWeb开发-Servlet】day02-使用eclipse实现Servlet开发

目录 1、安装IDE-eclipse编译器 2、配置IDE开发环境 &#xff08;1&#xff09;使用eclipse关联Tomcat服务器 &#xff08;2&#xff09;使用Servlet访问Hello World页面 &#xff08;3&#xff09;Java中常用的方法调用方式 &#xff08;4&#xff09;Java中常用的反射机…

web3.0学习入门7:深入学习Web3.0

Web3.0背景 2个大事件&#xff1a; 1、2021年10月28日&#xff0c;月活破30亿的Facebook正式官宣改名为Meta&#xff0c;元宇宙和Web3等概念正式从币圈破圈&#xff1b; 2、2021年12月8日&#xff0c;美国众议院加密金融听证会有议员喊出“确保Web3.0革命发生在美国”&#…

数字图像处理实验(二)|图像变换(附实验代码和截图)

文章目录一、实验目的二、主要仪器设备三、实验原理&#xff08;一&#xff09;变换原理1.离散傅里叶变换2.离散余弦变换3.频谱平移&#xff08;二&#xff09;频谱分析原理四、实验步骤和内容1. 为下面三段程序写出注释并上机运行&#xff0c;将实际运行结果如实记录到实验报告…

《数据结构》队列

学习目录队列队列的概念队列的使用(Queue)队列的模拟实现循环队列双端队列&#xff08;Deque&#xff09;面试题队列 队列的概念 队列是一种先进先出&#xff0c;后进后出的特点&#xff0c;是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表…

selenium使用

selenium使用一 bs4搜索文档树二 css选择器三 selenium基本使用四 无界面浏览器五 selenium其它用法5.1 登录百度5.2 获取位置属性大小&#xff0c;文本5.3 元素操作5.4 执行js代码5.5 切换选项卡5.6 浏览器前进后退5.7 异常处理六 selenium登录cnblogs获取cookie七 抽屉半自动…

kubernetes使用(1.25)

kubernetes使用&#xff08;1.25&#xff09; 内核是AMD、ARM、 $ arch uname -a 注&#xff1a;x86_64,x64,AMD64基本上是同一个东西 K8S 核心概念 Kubernetes有很多核心概念&#xff0c;我们先看下几个核心的概念。其他概念可以看一下我的安装文档 Deployment Deploy…

实现国产化转型,ZStack Cloud 助力中铁财务数字化转型!

中铁财务是中国中铁旗下的金融服务核心企业&#xff0c;随着新业务的快速发展&#xff0c;原有的烟囱式架构使得资源利用率相对较低&#xff0c;难以与其他系统有效协调工作。基于国产化布局的需要&#xff0c;中铁财务选择了 ZStack Cloud 云平台&#xff0c;在充分利旧的基础…

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局 实际案例图片 显示默认地址 修改收货地址后 地址列表 显示默认地址页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 用到了页面间传值 uni.onu…

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…