8月2日SpringBoot学习笔记

news2024/9/22 1:29:19

今日内容:  AOP  面向切面       代理模式    springmvc 运行原理      拦截器    springmvc异常处理机制    


代理模式

        为其他对象提供一种代理以控制对这个对象的访问。想在访问一个类时做一些控制是使用。

静态代理

优点:便于理解

缺点:

        1.代码冗余:当多个被代理类,多个需增强方法的增强内容一样时,代码重复冗余

        2.不易维护:每个被代理类需要专门维护一个代理类,类成倍增加,需增强方法增加时,需要同时维护代理类和被代理类。

动态代理

        运行时动态地生成类字节码,加载进JVM。一般配合泛型实现。

        1.JDK动态代理(组合,被代理类必须实现接口)

        2.CGLIB动态代理(继承,被代理类不能被final修饰)

AOP

        AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

        面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术.

AOP作用

        AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

        主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。

        简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

Spring AOP的术语

Spring AOP 通知分类

Spring AOP 织入时期

基于AspectJ的SpringAOP

        AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持.

添加依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.3.16</version>
</dependency>
 

定义切点

        通过通过execution函数来定义切点,注解为@Pointcut("execution()")

        被定义切点的类之后使用@Autoward注入时会注入此类的代理类(此类的子类,包含代理处理器,处理程序等等),而不是本类,通过动态代理实现。

        具体使用方法见:http://t.csdnimg.cn/6T32o  (本人太垃圾了真不懂所以直接看别人的吧)

举例使用:

SpringMVC

        Spring MVC 使用 MVC 架构模式的思想,将 Web 应用进行职责解构,把一个复杂的 Web 应用划分成模型(Model)、控制器(Contorller)以及视图(View)三层,有效地简化了 Web 应用的开发,降低了出错风险,同时也方便了开发人员之间的分工配合.

Spring MVC @Controller和@RequestMapping注解

        @Controller 注解可以将一个普通的 Java 类标识成控制器(Controller)类

@RequestMapping 注解的属性

它通常被标注在控制器方法上,负责将请求与处理请求的控制器方法关联起来,建立映射关系。

        修饰方法:value 属性值就表示访问该方法的 URL 地址。

        修饰类:value 属性的取值就是这个控制器类中的所有控制器方法 URL 地址的父路径。

各个属性作用:

        value 属性:请求映射地址

        name 属性:相当于方法的注释,解释用来干什么的

        method 属性:没有设置就支持全部请求类型,不然method = "GET/POST/DELETE/PUT ",这玩意真不如@GetMapping来的痛快。

        params 属性,headers 属性不常用,我也看不懂,用到了再说。

@Controller和@RestController
package com.easy.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class EasyEController {

	@RequestMapping("methoda")
	public String methoda() {
		System.out.println("---------methoda");
		//返回地址  
		//forward:/  默认  转发:同一个服务器中不同的服务器进行转发(同一个项目)
			//转发是request对象执行forward方法
			//浏览器发送了一个请求,可以转发到项目中受保护的资源 如:WEB-I
		//redirect:/ 重定向:可以在不同的服务之间跳转,浏览器发送两次请求
			//重定向是通过response对象通知浏览器重新访问
			//可以访问外网
		return "redirect:/methodb";
	}
	@RequestMapping("methodb")
	@ResponseBody//返回值直接写入Response对象
	public String methodb() {
		System.out.println("---------methodb");
		return "this is methodb";
	}
	
	@RequestMapping("methodc")
	public String methodC() {
		System.out.println("-----------methodC");
		return "index.jsp";
	}
}

@RestController:是@Controller与@ResponseBody的组合,表示返回值直接写入Response对象,即返回响应正文;

@Controller:使用 @Controller 的类通常需要返回一个视图名称

        返回值修饰:

                1.forward:  默认  转发:同一个服务器中不同的服务器进行转发(同一个项目),转发是request对象执行forward方法,浏览器发送了一个请求,可以转发到项目中受保护的资源 如:WEB-I
                2.
redirect: 重定向:可以在不同的服务之间跳转,浏览器发送两次请求,重定向是通过response对象通知浏览器重新访问,可以访问外网

@PathVariable  
@RestController
@RequestMapping("/books")
public class BookController {

    @GetMapping("/{bookId}")
    public Book getBookById(@PathVariable("bookId") Long bookId) {
        // 假设这里调用了服务层来获取书籍信息
        return bookService.findById(bookId);
    }
}

使用http://localhost:8080/books/123访问,在这个URL中,123是路径变量bookId的值,它将被传递给getBookById方法。

@requestparam
@RequestMapping("search")
public List<User> searchUsers(@RequestParam(value = "name", required = false, defaultValue = "John") String name) {
    // 如果请求中没有提供name参数,name变量将默认为"John"
}

在这个例子中如果请求的URL是http://localhost:8080/users/search?name=mike在这个例子中name就是mike;如果请求的URL是 http://localhost:8080/users/search(没有name参数),那么name变量将自动被赋予默认值 "John"

@PathVariable 从URL路径中获取值,@RequestParam 从查询参数中获取值。

springmvc 运行原理

    1.用户发送request请求至前端控制器;

    2.前端控制器调用处理器映射器查找处理器;

    3.处理器映射器返回执行链 至前端控制器;

    4.前端控制器调用处理器器适配器去执行处理器;

    5.处理器适配器调用处理器;

    6.处理器处理完成之后返回ModelAndView至处理器适配器;

    7.处理器适配器返回ModelAndView至前端控制器;

    8.前端控制器调用视图解析器解析视图;

    9.视图解析器解析视图并返回view至前端控制器;

    10.前端控制器渲染视图(view);

    11.前端控制器向用户响应视图。

Spring MVC拦截器

        它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前handler、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。

使用拦截器的步骤

        1.实现拦截器接口:创建一个类实现HandlerInterceptor接口,并实现其方法。

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在控制器方法调用之前执行
        return true; // 如果返回false,请求将不会继续执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在控制器方法调用之后执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求处理完毕后执行,无论成功或异常
    }
}

        2.注册拦截器:将拦截器注册到Spring MVC中。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/api/**") // 指定拦截器应用的路径模式
                .excludePathPatterns("/api/public/**"); // 排除不需要拦截的路径
    }
}

拦截器的执行流程

1.当请求的路径与拦截器拦截的路径相匹配时,程序会先执行拦截器类(MyInterceptor)的 preHandle() 方法。若该方法返回值为 true,则继续向下执行 Controller(控制器)中的方法,否则将不再向下执行;

2.控制器方法对请求进行处理;

3.调用拦截器的 postHandle() 方法,此时我们可以对请求域中的模型(Model)数据和视图做出进一步的修改;通过 DispatcherServlet 的 render() 方法对视图进行渲染;

4.调用拦截器的 afterCompletion () 方法,完成资源清理、日志记录等工作。

多个拦截器的执行流程

springmvc异常处理机制

        在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,它可以对控制器方法执行过程中出现的各种异常进行处理。

        Srping MVC 为 HandlerExceptionResolver 接口提供了多个不同的实现类

Spring MVC的异常处理机制允许开发者捕获和处理Web应用程序中的异常。以下是Spring MVC异常处理的关键点:

1. **@ControllerAdvice**:
   - 这是一个类级别的注解,用于定义一个类作为全局异常处理器。它与`@ExceptionHandler`注解结合使用来处理异常。

2. **@ExceptionHandler**:
   - 这是一个方法级别的注解,用于声明特定异常的处理方法。它可以与`@ControllerAdvice`结合使用,处理全局异常,或者直接用于控制器类中,处理特定控制器的异常。

3. **异常处理方法**:
   - 异常处理方法可以返回一个`ModelAndView`对象,用于渲染特定的视图,或者返回一个`ResponseEntity`对象,用于构造响应状态和正文。

4. **异常类型**:
   - 异常处理方法可以声明处理特定类型的异常,也可以使用`Throwable`类型来捕获所有异常。

5. **异常参数**:
   - 异常处理方法可以接收异常对象作为参数,以便访问异常信息。

6. **请求和响应对象**:
   - 异常处理方法还可以接收`HttpServletRequest`和`HttpServletResponse`对象,以便访问和修改请求和响应的状态。

7. **响应状态**:
   - 使用`@ResponseStatus`注解可以为异常处理方法指定HTTP响应状态。

8. **异常处理顺序**:
   - 如果有多个异常处理方法可以处理同一个异常,Spring将按照声明它们的顺序来调用。

9. **自定义异常**:
   - 开发者可以定义自定义异常类,并使用`@ControllerAdvice`和`@ExceptionHandler`来处理这些异常。

10. **继承和组合**:
    - `@ControllerAdvice`类可以继承其他`@ControllerAdvice`类,或者使用`@Inherited`注解来共享异常处理方法。

11. **异常传播**:
    - 异常处理方法可以决定是否将异常传播到其他处理器。

12. **RESTful API异常处理**:
    - 对于RESTful API,异常处理方法通常返回JSON或XML格式的错误信息,而不是渲染视图。

### 示例:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SpecificException.class)
    public ResponseEntity<String> handleSpecificException(SpecificException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleAllExceptions(Exception ex) {
        return new ResponseEntity<>("An unexpected error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

        在这个示例中,`GlobalExceptionHandler`类使用`@ControllerAdvice`注解定义了两个异常处理方法。第一个方法`handleSpecificException`专门处理`SpecificException`类型的异常,而第二个方法`handleAllExceptions`作为一个通用异常处理器,捕获所有未被前面处理器处理的异常。

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

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

相关文章

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出&#xff0c;一般都缩写为I/O。 在实现外设的I/O时&#xff0c;内核必须处理3个可能出现的问题&#xff1a; &#xff08;1&#xff09;必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址&#xff1b; &#xff08…

java面试题Spring部分(四)

一、什么事spring的三级缓存 典型回答 在Spring的BeanFactory体系中&#xff0c;BeanFactory是Spring IOC容器的基础接口&#xff0c;其DefaultSingletonBeanRegistry类实现了BeanFactory接口&#xff0c;并维护了三级缓存&#xff1a; public class DefaultSingletonBeanRe…

如何在OpenHarmony 4.1R上设置系统默认不锁屏(修改系统锁屏应用)

本文介绍如何修改系统锁屏应用&#xff0c;从而实现在OpenHarmony 4.1R上设置系统默认不锁屏。 环境配置 1.DevEco Studio 4.1 Release&#xff0c;下载链接地址 API10 Full SDK,安装教程 步骤 1.首先下载4.1r分支的系统锁屏应用applications_screenlock 2.修改系统锁屏应…

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧

【Plotly-驯化】一文画出漂亮的流量漏斗图&#xff1a;plotly.funnel函数使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获…

HTML+CSS練習---空隙產生記錄

1.第一層和第二層之間的間隙&#xff1a;以為導航欄超過高度朝下擠下來了 2.第2層兩個div中的空隙 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>font-face {f…

ATTCK实战系列-红队评估 (一)Vulnstack三层网络域渗透

目录 一、搭建环境 1.靶场下载地址&#xff1a; 2、网络拓扑 3、环境配置 Win7&#xff08;外网服务器 &#xff09; Win2008&#xff08;域控&#xff09; Win2003&#xff08;域成员&#xff09; 4、启动环境 二、信息收集 1、端口扫描 2、目录扫描 三、漏洞利用…

IM即时通讯客服聊天系统源码(某站售8千)

即时通讯客服聊天系统已经成为企业提供卓越客户服务的不可或缺的工具。为了帮助您快速搭建强大的客服聊天系统&#xff0c;提供了一款全面的源码模板&#xff0c;基于Java和Spring Boot微服务架构构建&#xff0c;支持多种功能模块&#xff0c;以及消息加密、红包、消息撤回等功…

基于JSP的学生综合考评管理系统

你好&#xff0c;我是专注于教育信息化的开发者&#xff0c;很高兴为您介绍本系统。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;Eclipse、MySQL数据库管理工具 系统展示 首页 管理员功能 教师功能 学生功能 摘要 本文…

笔记本怎么手动设置ip地址:一步步教你操作

在使用笔记本电脑连接网络时&#xff0c;有时候我们需要手动设置IP地址以满足特定的网络需求或解决网络问题。手动设置IP地址可以帮助我们更好地控制网络连接&#xff0c;确保设备在网络中的稳定性和安全性。然而&#xff0c;对于不熟悉网络设置的用户来说&#xff0c;手动设置…

EPLAN EDZ 文件太大导入很慢如何解决?

目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…

[CP_AUTOSAR]_系统服务_DEM模块(二)功能规范介绍

目录 1、DEM 功能规范描述1.1、Startup behavior1.2、Monitor re-initialization 在前面 《[CP_AUTOSAR]_系统服务_DEM模块&#xff08;一&#xff09;》文中&#xff0c;简要介绍了 DEM 模块的功能、与其它模块之间的功能交互&#xff0c;本文将接着介绍 DEM 模块的功能规范。…

Web前端:Vue开发环境搭建

一、搭建开发环境&#xff1a; 1.nodejs安装&#xff1a; 下载地址&#xff1a; https://nodejs.org/dist/v20.13.1/node-v20.13.1-x64.msi 查看版本号&#xff1a; node -v 2.安装nrm(用于指定国内镜像源&#xff0c;加速依赖包下载速度)&#xff1a; 安装nrm&#xff…

程序员的魔法石!

本文由 ChatMoney团队出品 AI自己写代码&#xff0c;这只是传说&#xff1f;还是摸鱼新指南&#xff1f; AI出现之前&#xff0c;从来都是老板或产品经理提需求&#xff0c;程序员熬夜加班吭哧吭哧写代码或者是从Github&#xff0c;Stackoverflow上controlc&#xff0c;control…

为面试准备的一些内容

开发中使用了什么技术&#xff1f; mvvm、compose、livedata、单例模式、工厂模式、弱引用、线程池、Handler。 对于项目一开始我们打算使用aosp原生的管控方式&#xff0c;如UsageStatManager获取每个app的使用时长&#xff0c;和使用PackageManager的setPackagesSuspended方…

【数据结构入门 】栈

目录 前言 一、栈的概念及结构 二、栈的实现 1. 栈的声明 2.初始化栈 3. 栈的销毁 4.判断是否为空栈 5.入栈&#xff08;只能插入栈顶元素&#xff09; 6. 出栈&#xff08;只能从栈顶删除&#xff09; 7.栈的大小 8.获取栈顶元素 总结 前言 在计算机科学中&#xf…

黑马Java零基础视频教程精华部分_10_面向对象进阶(2)

系列文章目录 文章目录 系列文章目录一、多态1、什么是多态&#xff1f;2、多态的表现形式3、多态的前提4、多态的好处5、多态调用成员的特点6、多态的优势和弊端7、引用数据类型的类型转换 二、包1、什么是包&#xff1f;2、包名的规则3、使用其他类的规则 三、final 最终的&a…

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中&#xff0c;填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段&#xff0c;发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…

完全免费的 TTS 文字转语音来了!

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 完全免费的 TTS 文字转语音来了&#xff01; 再也不用被国内外各种语音合成割韭菜了。 试了下&#xff0c;确实是不限次数&#xff0c;不限语种&#xff0c;完全免费.输出视频如下&#xff1a; 效果就…

springboot干部考核系统-计算机毕业设计源码74229

摘要 随着我国社会经济的快速发展&#xff0c;对干部队伍的素质要求越来越高&#xff0c;如何科学、公正、准确地评价干部的工作绩效&#xff0c;激励干部发挥出更大的工作潜能&#xff0c;成为了当务之急。近年来&#xff0c;计算机技术和网络技术的飞速发展&#xff0c;为干部…

Minetest大师:1.0.21版本发布

下载Minetest大师v1.0.21 1、简介 Minetest大师&#xff0c;一款致力于Minetest的游戏盒子 可加Q群-&#xff1a;123117246&#xff0c;了解或获取最新版本 2、增加了大量的基础功能 资源中心与ContentDB同步&#xff0c;增加资源搜索、安装功能 增加在线服务器列表&#…