Spring5框架总结学习(从入门到进阶)-AOP

news2025/7/13 4:37:27

文章目录

  • AOP
    • 1、基本概念
    • 2、底层原理
    • 3、底层原理实现
    • 4、AOP(术语)
    • 5、准备工作
    • 6、基于注解实现

AOP

1、基本概念

  • 面向切面编程
  • 可用对各个业务逻辑各个部分进行隔离

在这里插入图片描述

2、底层原理

AOP底层使用动态代理
有2种情况动态代理

  • 有接口 使用JDK动态代理
  • 无接口 使用CGLIB动态代理

3、底层原理实现

1、JDK接口

package Portx;

import com.Dao.UserDao;
import com.Dao.UserDaoDemo;
import com.Spring5.User;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Portex {


    public static void main(String[] args) {
        Class[] interfaces = { UserDao.class };
        UserDaoDemo user=new UserDaoDemo();
      UserDao userDao=  (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserProxy(user));
    }
}

class UserProxy implements InvocationHandler
{
    //把之前的对象传进来
    private Object obj;
    public UserProxy(Object obj)
    {
        this.obj=obj;
    }
    //增强的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object ret=method.invoke(obj,args);
        return ret;
    }
}

4、AOP(术语)

1、连接点

类里面哪些方法可以被增强,这些方法被称为连接点

2、切入点

实际被真正增强的方法,称为切入点

3、通知

实际增强的逻辑部分称为通知。(也就是增加的功能)
前置通知
后置通知
环绕通知
异常通知
最终通知

4、切面

5、准备工作

1、Aspectj不是Spring组成部分,独立AOP框架,一般将Aspectj和Spring框架一起使用,进行AOP操作。
2、基于Aspectj实现AOP操作

  • 基于XML配置文件
  • 基于注解方式实现

3、在项目里面引入依赖

4、切入点表达式

execution([权限修饰符][返回类型][类全路径][方法名称] ([参数列表]))
例如
对com.BookDao类里面的add进行增强
execution(*com.BookDao.add(…))

对com.BookDao类里面的所有方法进行增强

execution(*com.BookDao. *(…))

对com包下所有类,方法进行增强

execution(*com. * . *(…))

6、基于注解实现

1、创建类

public class UserDemo {
    public void add()
    {
        System.out.println("add+Plus");
    }
    
}

2、创建增强类,编写增强的逻辑

public class UserStrong {

    //前置通知
    public void before()
    {
        System.out.println("add before...");

    }
}

3、进行通知的配置

  1. 开启注解扫描
  2. 使用注解对象
  3. 在增强类上面添加注解@Aspect
  4. 在Spring配置文件中开启生成代理对象

a、引入名称空间context,aop

<beans xmlns="http://www.springframework.org/schema/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"
       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>

b、开启组件扫描

<beans xmlns="http://www.springframework.org/schema/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"
       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">


<context:component-scan base-package="Strong">
        
    </context:component-scan>
</bean>

c、创建类对象

@Component
public class UserStrong {
@Component
public class UserDemo {

d、.在增强类上面添加注解@Aspect

@Aspect
@Component
public class UserStrong {

e、开启生成代理对象

<beans xmlns="http://www.springframework.org/schema/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"
       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">


<context:component-scan base-package="Strong">
        
    </context:component-scan>
    <!-- 开启代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</bean>

f、配置不同类型的通知

@Aspect
@Component
public class UserStrong {

    //前置通知
    @Before(value = "execution(* Strong.UserDemo.add(..))")
    public void before()
    {
        System.out.println("add before...");

    }
}
   //后置
    @After(value = "execution(* Strong.UserDemo.add(..))")

	//异常通知,有异常时才执行
    @AfterThrowing(value = "execution(* Strong.UserDemo.add(..))")

	//在返回结果后执行
    @AfterReturning(value = "execution(* Strong.UserDemo.add(..))")
    
    //环绕,在方法之前,之后都执行
    @Around(value = "execution(* Strong.UserDemo.add(..))")
    public void before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("add around...");

        //被增强的方法
        proceedingJoinPoint.proceed();

    }

4、测试

 ApplicationContext context=new ClassPathXmlApplicationContext("bean6.xml");
        UserDemo userDemo=context.getBean("userDemo",UserDemo.class);
        userDemo.add();

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

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

相关文章

ffmpeg编译安装

ffmpeg编译安装前言一、下载ffmpeg二、编译安装2.1 Linux编译ffmpeg2.2 Windows编译ffmpeg总结前言 Fmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含…

154. SAP UI5 Smart Table 和 Smart Filter Bar 的联合使用方法介绍

本教程第 147 个步骤,我们介绍了 SAP UI5 Smart Table 控件的用法: SAP UI5 应用开发教程之一百四十七 - SAP UI5 SmartTable 控件的使用介绍如下图所示: 本步骤我们在 Smart Table 本身的基础上再进一步,学习如何将 Smart Table 配合 Smart Filter Bar 共同使用。 先看一…

JDK之强软弱虚引用

Java中强软弱虚引用的整体架构&#xff1a; 强引用 当内存不足&#xff0c;JVM开始垃圾回收&#xff0c;对于强引用的对象&#xff0c;就算是出现了OOM也不会对该对象进行回收&#xff0c;死都不收。 强引用是我们最常见的普通对象引用&#xff0c;只要还有强引用指向一个对象…

Fabric.js 元素被遮挡的部分也可以操作

本文简介 点赞 关注 收藏 学会了 题目&#xff1a; 当两个元素有部分重叠时&#xff0c;选中底层元素后&#xff0c;想通过被盖住的部分移动元素&#xff0c;该如何实现&#xff1f; 其实 Fabric.js 已经提供了相应的 API 去完成上面的需求了。但直到今天&#xff0c; Fabr…

动态内存开辟+柔性数组

C/C中程序内存区域划分 &#xff08;数据段就是静态区&#xff09; C/C程序内存分配的几个区域: 1.栈区 (stack): 在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集…

linux系统中裸机实现RTC的基本方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何显示RTC实时时钟的方法。 目录 第一&#xff1a;RTC实时时钟简介 第二&#xff1a;利用SNVS_LP的SRTC的具体配置方法 第三&#xff1a;初始化RTC对应的代码 第一&#xff1a;RTC实时时钟简介 在高端芯片中&#xff0…

Docker管理面板Crane开源了!

导读数人云容器管理面板 Crane 开源啦&#xff01;Crane 包含着数人云工程师对 Docker 最新技术的热爱和实践。希望借助开源社区的力量&#xff0c;让 Crane 完善自身&#xff0c;更好地成长起来&#xff0c;让更多的国内用户体验并参与到最新的容器技术中。在 Docker 内置 Swa…

Java HashMap

HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是无序的&#x…

2023年天津理工大学中环信息学院专业课考试具体安排

天津理工大学中环信息学院2023年高职升本科专业课考试时间地点及防疫须知 一、考试时间地点 考试时间&#xff1a;2022年12月29日上午。 具体考试时间以准考证上显示的为准。 考生可提前半小时入场&#xff0c;考试开始&#xff08;铃声&#xff09;后&#xff0c;禁止入场&…

【python绘制地图——folium实用功能进阶】

Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍&#xff08;思维导图&#xff09; 第二章 使用folium制作地图 第三章 folium实用功能进阶 第三章 使用Html2Image生成png图片 第四章 使用reportlab制作pdf报告 文章目录Python使用folium制作地图并生成…

基于C++实现对UNet图像分割的部署

本博文利用UNet介绍图像分割的部署,重点介绍采用warpaffine对图像进行预处理,以及后处理decode部分的代码。 1. Unet网络介绍 UNet它是一个encoder - decoder的结构,那么encoder对应就是这个u型网络左边这半部分,也就是我们特征提取及下采样这部分。decoder解码就是右边部…

华为机试_HJ41 称砝码【中等】【menset】【多重背包】【动态规划】【收藏】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 动态规划 代码二 代码三 收藏点 1. menset函数 2. 动态规划-多重背包问题 描述 现有n种砝码&#xff0c;重量互不相等&#xff0c;分别为 m1,m2,m3…mn &#xff1b; 每种…

【程序人生】我填写《2022年国内软件质量调查问卷》的感想

1、前言 说一下为啥会参加这个问卷&#xff0c;其实初衷是本着自身感受&#xff0c;和希望能学习到更好的软件质量方案去填写的。所以&#xff0c;最后也是建议本次问卷的内容&#xff0c;能够提供更多切实可行的提高软件质量的实践方案。 2、参与问卷后的所思所想 2.1 经历过…

nginx 解决跨域问题——(CORS)

跨域前世今生 跨域是一种安全机制。 在开发阶段与上线前就必须提前考虑到的安全问题并且采取合适的手段去避免这个问题带来的程序错误。 ![aHR0cDovL2ZpbGUubWljcm9hbnN3ZXIuY24vYmxvZ181M18xLnBuZw.png](https://img-blog.csdnimg.cn/img_convert/1803660cf39d7222197f9bd7ae…

电磁场的变化方式 工程电磁场 P27

小小纪念一下 我们要注意 我们不研究瞬态过程&#xff0c;只关心稳态过程 瞬态过程的长短取决于电路的结构还有伏安特性&#xff0c;只要我们的激励是周期的&#xff0c;如果是一个周期性的信号&#xff0c;可以分解成一系列的正弦分量&#xff0c;对于我们的电磁场也一样 如…

嵌入式学习之Linux驱动:IO模型(1)概览

文章目录什么是IO呢&#xff1f;IO执行过程IO模型引入IO模型的种类阻塞IO非阻塞IOIO多路复用信号驱动IO异步IO什么是IO呢&#xff1f; IO的英文全称是input和output&#xff0c;翻译过来就是输入和输出。 在冯诺依曼结构中&#xff0c;将计算机分成为5个部分&#xff1a;运算器…

太阳能电池板自动清洗机器人的制作分享

本文素材来源于宁夏大学 作者&#xff1a;李伟荣、李学辉、金茹芳、沙小平 指导老师&#xff1a;康彩、张冬 一、执行总结 1.1项目概述 在“十三五”发展的大形势下&#xff0c;由于现在国家大力发展清洁能源&#xff0c;而太阳能发电受到了很大重视&#xff0c;但是目前并没…

Cartesian product

In mathematics, specifically set theory, the Cartesian product of two sets A and B, denoted A  B, is the set of all ordered pairs (a, b) where a is in A and b is in B.[1] In terms of set-builder notation, that is {\displaystyle A\times B{(a,b)\mid a\in …

线性模型-优化方法及推导过程

本文包含大量不严谨的公式写法&#xff0c;只是推式子时候打草记录一下… 线性模型(Linear Model)是机器学习中应用最广泛的模型&#xff0c;指通过样本特征的线性组合来进行预测的模型。给定一个DDD维的样本特征的线性组合来进行预测的模型&#xff0c;给定一个DDD维样本x[x1,…

接口自动化测试(Python+Requests+Unittest)

(1)接口自动化测试的意义、前后端分离思想 接口自动化测试的优缺点&#xff1a; 优点&#xff1a; 测试复用性。 维护成本相对UI自动化低一些。 为什么UI自动化维护成本更高&#xff1f; 因为前端页面变化太快&#xff0c;而且UI自动化比较耗时&#xff08;比如等待页面元素的…