Spring 6【方法参数校验、SpingAOP介绍、Schema-based方式实现AOP 】(十四)-全面详解(学习总结---从入门到深化)

 

目录

4.方法参数校验

SpingAOP介绍

Schema-based方式实现AOP 


4.方法参数校验

Spring框架提供了一种校验方法参数的方法,在调用一个方法传入参数后,会判断参数是否满足数据校验。如果满足方法执行,如果不满足:不执行方法,报异常。这和上面是不一样的。并且不需要使用 LocalValidatorFactoryBean 。

方法参数校验的核心有三点:

1、IoC容器中必须有MethodValidationPostProcessor这个Bean。默认没有,需要我们手动配置

2、需要进行方法校验的类上需要有@Validated注解

3、需要校验的方法参数前面需要有@Valid注解

4.1 新建类,添加校验注解 

我们还是用Student类,并在属性中添加校验

@Data
public class Student {@NotBlankprivate String name;@Positiveprivate int age;
}

4.2 新建类,添加方法

新建com.tong.validation.StudentServiceImpl类,并添加注解

@Validated // 重要
public class StudentServiceImpl{public void student(@Valid Student stu){// @Valid 重要System.out.println("执行了这个方法");}
}

 4.3 新建配置文件

新建配置文件applicationContext-methodvalidation.xml 在配置文件中配置MethodValidationPostProcessor和StudentServiceImpl的Bean。 此功能和LocalValidatorFactoryBean无关,不需要配置LocalValidatorFactoryBean的Bean。

<bean id="studentServiceImpl" class="com.tong.validation.StudentServiceImpl"></bean><bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcess
or"></bean>

 4.4 新建测试类

新建com.tong.test.ValidationMethodTest测试类

@SpringJUnitConfig
@ContextConfiguration("classpath:applicationContext-methodvalidation.xml")
public class ValidationMethodTest {@AutowiredStudentServiceImpl studentService;@Testvoid test(){Student stu = new Student();studentService.student(stu);}
}

 4.5 查看运行效果

在控制台报异常。

jakarta.validation.ConstraintViolationException: student.arg0.age: 必须是正数,
student.arg0.name: 不能为空

4.6 校验通过写法

给Student对象的属性设置上值,让校验通过。重新运行后,发现方法成功被调用。

@SpringJUnitConfig
@ContextConfiguration("classpath:applicationContext-methodvalidation.xml")
public class ValidationMethodTest {@AutowiredStudentServiceImpl studentService;@Testvoid test(){Student stu = new Student();stu.setName("smallming");//新加stu.setAge(16);// 新加studentService.student(stu);}
}

SpingAOP介绍

1.SpringAOP介绍

AOP(Aspect-oriented Programming,面向切面编程)并不是Spring框架提出的。而是AOP联盟组织的 一套规范。Spring AOP属于对AOP规范的一个具体实现。 我们先看看Spring官方对Spring AOP的解释。

官方说明:

翻译含义: 

面向切面编程 (AOP) 通过提供另一种思考程序结构的方式来补充面向对象编程 (OOP)。OOP 中模块化的关键单位是类,而 AOP 中模块化的单位是切面。切面能够实现跨越多种类型和对象的关注点(例如事务 管理)的模块化.(这种关注点在 AOP 文献中通常被称为“横切”关注点。) Spring 的关键组件之一是 AOP 框架。虽然 Spring IoC 容器不依赖于 AOP(意味着如果您不想使用 AOP,则不需要使用 AOP),但 AOP 补充了 Spring IoC 以提供一个非常强大的中间件解决方案。

下面对上面官方解释的总结:官方在强调AOP时强调了下面几点:

      1. AOP 叫做面向切面编程

      2. AOP 是对OOP的补充

      3. AOP的核心是切面

      4. AOP是依赖IoC

      5. AOP可以让多个类型和对象以模块化的方式形成横切面。 

所以AOP的解释:AOP是面向切面编程。可以对程序中方法进行扩展,且扩展内容和目标方法是松耦合 的(无论对目标方法还是对客户端,扩展后都是无感知的)、模块化的。 

想要把AOP解释清楚,就必须把AOP中的专业术语搞清楚。

 

Aspect:切面。即join point + Advice

join point: 切入点。就是我们平时说的目标方法,或说对哪个方法做扩展,做增强。

Advice:通知,增强内容。

Pointcut:切点。就是表达式,通过表达式说明哪些方法是join point

AOP Proxy:代理。Spring支持JDK动态代理和cglib动态代理两种方式,可以通过proxy-target-class=true把默认的JDK动态代理修改为Cglib动态代理。

Weaving:织入。织入就是把Advice添加到join point的过程。

在实际开发中AOP主要应用在Service层。 

 

Schema-based方式实现AOP 

1.实现AOP的两种方式

在Spring中提供了两种方式实现AOP:

  •       Schema-based:所有的通知都需要实现特定类型的接口。
  •       AspectJ:可以使用普通Java类结合特定的配置标签实现通知。

无论使用哪种方式在项目中都需要导入spring-aop和aspectjweaver两个依赖。

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.6</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.19</version>
</dependency>

 2.在Schema-based方式中通知的分类

  • 前置通知:在切入点之前执行的增强功能。通知需要实现MethodBeforeAdvice接口
  • 后置通知:在切入点之后执行的增强功能。通知需要实现AfterReturningAdvice接口
  • 环绕通知:一个方法包含了前置通知和后置通知的功能。通知需要实现MethodInterceptor接口
  • 异常通知:如果切入点中出现了异常(绝对不能try...catch解决了异常)就会触发异常通知。通知 需要实现ThrowsAdvice接口。

3. 前置通知 

前置通知是在切入点之前执行的增强。 在项目中保证有Spring框架最基本环境依赖以外,还需要打入aspectj依赖

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.6</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.19</version></dependency><!-- 单元测试 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.6</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope></dependency><!-- lombok 支持 @Data等注解 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>provided</scope></dependency>
</dependencies>

3.1 新建通知类

新建com.bjsxt.advice.MyBefore。

MethodBeforeAdvice接口中必须重写before方法,方法中三个参数:

  • method:切入点方法对象
  • args:切入点方法参数
  • target:切入点方法所在的对象
package com.tong.advice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class MyBefore implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("前置通知");}
}

3.2 配置切面

<?xml version="1.0" encoding="UTF-8"?>
<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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.tong.mapper,com.tong.service.impl"> </context:component-scan><bean id="mybefore" class="com.tong.advice.MyBefore"></bean><aop:config><!-- 切入点是固定语法:execution(* 方法的全限定路径带有参数) --><!-- 无参方法:test()--><!-- 有参方法:test(int,java.lang.String)--><!-- 如果希望把所有叫做test的方法都匹配上,不考虑参数test(..)--><!-- 全限定路径的层数绝对不能少,但是如果希望对类或包做统配使用*--><!-- com.tong.service.impl.*.*(..)--><aop:pointcut id="mypoint" expression="execution(* com.tong.service.impl.PeopleServiceImpl.test())"/><aop:advisor advice-ref="mybefore" pointcut-ref="mypoint"></aop:advisor></aop:config>
</beans>

4. 后置通知

后置通知是在切入点之后执行的增强。

4.1 新建通知类

新建com.bjsxt.advice.MyAfter。 AfterReturningAdvice接口中必须重写afterReturning方法,方法中四个参数:

  • returnValue:返回值
  • method:切入点方法对象
  • args:切入点方法参数
  • target:切入点方法所在的对象
package com.tong.advice;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class MyAfter implements AfterReturningAdvice {@Overridepublic void afterReturning(Object returnValue, Method method, Object[] args,Object target) throws Throwable {System.out.println("后置通知");}
}

4.2 配置切面

<?xml version="1.0" encoding="UTF-8"?>
<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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.tong.mapper,com.tong.service.impl"> </context:component-scan><bean id="mybefore" class="com.tong.advice.MyBefore"></bean><!-- 配置后置通知bean --><bean id="myafter" class="com.tong.advice.MyAfter"></bean><aop:config><aop:pointcut id="mypoint" expression="execution(* com.tong.service.impl.PeopleServiceImpl.test())"/><aop:advisor advice-ref="mybefore" pointcut-ref="mypoint"></aop:advisor><!-- 织入后置通知 --><aop:advisor advice-ref="myafter" pointcut-ref="mypoint"></aop:advisor></aop:config>
</beans>

5. 环绕通知

环绕通知可以实现前置通知和后置通知两种功能。

5.1 新建通知类

新建com.tong.advice.MyAround。

MethodInterceptor接口中必须重写invoke方法,方法中参数:

  • invocation:方法调用器。通过invocation可以proceed()方法调用执行点。 
package com.tong.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAround implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("环绕通知-前置增强");Object result = invocation.proceed();// 执行切入点System.out.println("环绕通知-后置增强");return result;}
}

 5.2 配置切面

<?xml version="1.0" encoding="UTF-8"?>
<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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.tong.mapper,com.tong.service.impl"> </context:component-scan><bean id="mybefore" class="com.tong.advice.MyBefore"></bean><bean id="myafter" class="com.tong.advice.MyAfter"></bean><!-- 配置环绕通知bean --><bean id="myaround" class="com.tong.advice.MyAround"></bean><aop:config><aop:pointcut id="mypoint" expression="execution(* com.tong.service.impl.PeopleServiceImpl.test())"/><!-- 只织入环绕,没有织入前置通知和后置通知。 --><aop:advisor advice-ref="myaround" pointcut-ref="mypoint"></aop:advisor></aop:config>
</beans>

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

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

相关文章

使用开源免费AI绘图工具神器-Stable Diffusion懒人整合包

使用开源免费AI绘图工具神器-Stable Diffusion懒人整合包 Stable Diffusion 是什么 Stable Diffusion (简称 SD) 是一款开源免费的以文生图的 AI 扩散模型&#xff0c;它和付费的 Midjourney 被人称为当下最好用的 AI 绘画工具。你在网上看到的绝大多数优秀 AI 图片作品&…

ROS 基础知识汇总

How to learn ROS ROS for Beginners: How to Learn ROS - The Construct ROSwiki 界面介绍 ROS/Tutorials/NavigatingTheWiki - ROS Wiki ROS要学会哪些&#xff1f;如何学习Ros&#xff1f; - 知乎 setup.bash 的作用 ROS中的setup.bash_泠山的博客-CSDN博客 包的层级架构 …

详细介绍 React 中如何使用 redux

在使用之前要先了解它的配套插件&#xff1a; 在React中使用redux&#xff0c;官方要求安装其他插件 Redux Toolkit 和 react-redux Redux Toolkit&#xff1a;它是一个官方推荐的工具集&#xff0c;旨在简化 Redux 的使用和管理。Redux Toolkit 提供了一些提高开发效率的工具…

MybatisPlus拓展篇

文章目录 逻辑删除通用枚举字段类型处理器自动填充功能防全表更新与删除插件MybatisX快速开发插件插件安装逆向工程常见需求代码生成 乐观锁问题引入乐观锁的使用效果测试 代码生成器执行SQL分析打印多数据源 逻辑删除 逻辑删除的操作就是增加一个字段表示这个数据的状态&…

用JavaScript和HTML实现一个精美的计算器

文章目录 一、前言二、技术栈三、功能实现3.1 引入样式3.2 编写显示页面3.2 美化计算器页面3.3 实现计算器逻辑 四、总结 一、前言 计算器是我们日常生活中经常使用的工具之一&#xff0c;可以帮助我们进行简单的数学运算。在本博文中&#xff0c;我将使用JavaScript编写一个漂…

剑指 Offer 26. 树的子结构

思路&#xff1a; 先统计B数的非空节点数countB。然后前序遍历A&#xff0c;当遇到A的值和B的第一个值相等时&#xff0c;则进行统计左右结构和值都相等的节点数和sum&#xff0c;如果sum countB&#xff0c;则true。 /*** Definition for a binary tree node.* public class…

android framework车载桌面CarLauncher的TaskView详细源码分析

1、构建相关的TaskView&#xff0c;装载到对应的ViewGroup b站免费视频教程讲解&#xff1a; https://www.bilibili.com/video/BV1wj411o7A9/ //packages/apps/Car/Launcher/src/com/android/car/carlauncher/CarLauncher.java void onCreate() { //ignoresetContentView(R.…

macos下安装john the ripper并配置zip2john+破解加密zip文件

为了破解加密的zip文件&#xff0c;需要用到john进行爆破密码。 1、首先使用homebrew安装john&#xff0c;可以安装它的增强版john-jumbo: brew install john-jumbo 2、安装后可以使用 john 命令验证&#xff1a; john 3、配置zip2john的环境——.zshrc下&#xff0c;&#x…

城市气象数据可视化:洞察气候变化,构建智慧城市

随着城市化进程的加速&#xff0c;城市气象数据的采集和分析变得越来越重要。气象数据不仅影响着人们的生活和出行&#xff0c;还与城市的发展和规划息息相关。在数字化时代&#xff0c;如何将城市中各个气象数据进行可视化&#xff0c;让复杂的数据变得简单易懂&#xff0c;成…

【JavaEE初阶】HTTP请求的构造及HTTPS

文章目录 1.HTTP请求的构造1.1 from表单请求构造1.2 ajax构造HTTP请求1.3 Postman的使用 2. HTTPS2.1 什么是HTTPS?2.2 HTTPS中的加密机制(SSL/TLS)2.2.1 HTTP的安全问题2.2.2 对称加密2.2.3 非对称加密2.2.3 中间人问题2.2.5 证书 1.HTTP请求的构造 常见的构造HTTP 请求的方…

简单工厂模式——集中式工厂的实现

1、简介 1.1、概述 简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a; 首先将需要创建的各种不同对象的相关代码封装到不同的类中&#xff0c;这些类称为具体…

【IDEA】idea不自动生成target

文章目录 1. 不生成target2. 仅部分文件不生成target2.1. 一般原因就是资源没有设置2.2. 配置编译src/main/java文件夹下的资源文件2.3. 清理缓存&#xff08;王炸&#xff09; 3. 参考资料 本文描述idea不生成target的几种情况以及处理方法 1. 不生成target 像下图这样根本就…

一篇文章搞定Java泛型

目录 介绍 优点 泛型类 语法定义 代码示例 泛型类注意事项 抽奖示例 泛型类派生子类 定义 代码示例 子类是泛型 子类不是泛型 泛型接口 定义 泛型方法 定义 代码示例 泛型方法与可变参数 泛型方法总结 ​编辑类型通配符 定义 代码示例 通配符的上限 定义 …

致敬图灵!HashData拥抱数据智能新时代!

图1&#xff1a;2023ACM中国图灵大会现场 生于1912年的艾伦图灵被称为“计算机科学之父”、“人工智能之父”。1966年&#xff0c;国际计算机协会&#xff08;ACM&#xff09;为了纪念这位卓越的科学家&#xff0c;设立了以其名字命名的ACM图灵奖&#xff0c;以表彰在计算机领…

入门redis你一定需要知道的命令

1、各种数据类型的特点 字符串(string)&#xff1a;普通字符串&#xff0c;Redis中最简单的数据类型 哈希(hash)&#xff1a;也叫散列&#xff0c;类似于Java中的HashMap结构 列表(list)&#xff1a;按照插入顺序排序&#xff0c;可以有重复元素&#xff0c;类似于Java中的Li…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

M 芯片的 macos 系统安装虚拟机 centos7 网络配置

centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了&#xff0c;如果重启网卡不管用&#xff0c;则重启虚拟机即可 “ ifcfg-ens160 ” 这…

黑苹果如何在macOS Sonoma中驱动博通网卡

准备资源&#xff08;百度&#xff1a;黑果魏叔 下载&#xff09; 资源包中包含&#xff1a;AirportBrcmFixup.kext/IOSkywalkFamily.kext/IO80211FamilyLegacy.kext/OpenCore-Patcher 使用方法&#xff1a; 1.将 csr-active-config 设置为 03080000 全选代码 复制 2.在 …

c++数据锁链

题目描述&#xff1a; 创建一个结构体为Node&#xff0c;具有value , next 两个属性&#xff1b; value为整型&#xff0c;用来储存结构体数值&#xff1b; next为Node类型指针&#xff0c;用来指向下一组数据地址&#xff1b; 第1组数据value 5&#xff1b; 第2组数据value …

【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back

文章目录 1.list的使用2.list的增删查改函数&#xff08;1&#xff09;push_front 在list首元素前插入值为val的元素&#xff08;2&#xff09;pop_front 删除list中第一个元素&#xff08;3&#xff09;push_back 在list尾部插入值为val的元素&#xff08;4&#xff09;pop_ba…