JAVASpring学习Day2

news2024/11/15 21:32:39

面向切面编程 (AOP)

面向切面编程是一种编程范式,用于在程序中分离关注点,例如日志记录、事务管理和安全性。它主要由以下几个关键组成部分构成:

连接点 (Join Point):在程序执行过程中可以插入切面的点,通常是方法的执行点。
切点 (Pointcut):确定在何处应用切面的一组连接点的定义。
通知 (Advice):在切点处执行的动作,包括前置、后置、异常、返回和环绕通知。
切面 (Aspect):切点和通知的组合。

package com.easy.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AOPObj {
    //定义切点
    @Pointcut("execution(* com.easy.controller.EasyAController.testA(..))")
    public void pointCuttesta(){}
    @Before("pointCuttesta()")
    public void before(){
        System.out.println("----------前置通知");
    }
}

代理模式
代理模式是一种结构型设计模式,通过代理对象控制对原始对象的访问。主要有两种类型:

静态代理:代理类在编译时已知道要代理的对象。
动态代理:代理类在运行时动态创建,可以代理任意实现了特定接口的对象。
动态代理的实现方式:
JDK动态代理:基于接口的代理,被代理的对象必须实现接口,利用 java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler 实现。
CGlib动态代理:通过继承被代理类来实现代理,可以代理没有实现接口的类,但不能代理 final 类。

package com.easy.proxy.dynamic.jdk;

import com.easy.proxy.staticproxy.EasyA;
import com.easy.proxy.staticproxy.Proxy;

public class Factory {
    public static Object getProxy(Object obj){
        //JDK代理只能实现接口中的方法
        return Proxy.newProxyInstance(
                obj.getClass().getClassLoader(),
                //类加载器
                obj.getClass().getInterfaces(),
                //实现接口
                new EasyInvocationHandler(obj)
        );
    }

    public static void main(String[] args) {
        EasyObj easy=new EasyObj();
        Object obj=getProxy(easy);//动态生成的一个代理类的对象
        if(obj instanceof EasyInterface){
            System.out.println("obj是代理对象是EasyInterface的实例");
            EasyInterface e=(EasyInterface)obj;
            e.easy();
        }
        Class c=obj.getClass();
        System.out.println(c);
        EasyA easya=new EasyA();
        obj=getProxy(easya);
        System.out.println(obj.getClass());
    }
}

Spring MVC

Spring MVC 是基于 Spring 框架的一种 Web 框架,用于开发 Web 应用程序。它主要由以下几个关键部分组成:

@Controller 和 @RestController:用于定义控制器类,处理 HTTP 请求。
@RequestMapping:用于将 HTTP 请求映射到控制器的处理方法上。
@PathVariable:用于从 URL 中获取参数。
@RequestParam:用于从 HTTP 请求中获取参数。
@GetMapping / @PostMapping / @PutMapping / @DeleteMapping:简化的 HTTP 方法映射注解。

package com.easy.controller;

import com.easy.bean.Staff;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
//REST 请求资源状态转换
//  get post put delete
//get  user/1      获取   user/get
//post  user....   新增   user/add
//delete  user/1   删除   user/delete?id=1
//put user....     编辑   user/edit
@RestController
//@Controller
@RequestMapping("user")
public class EasyDController {
    @RequestMapping("easyaa")
    public String easyaa(){
        return "easyaa method";
    }
    @RequestMapping("parama")
    public String paramA(String name){
        return "springmvc接收到的参数是:"+name;
    }
    //同时接收多个参数 MAP 接收 非常灵活
    @RequestMapping("paramb")
    public Map paramb(@RequestParam Map params){
        return params;
    }
    //使用封装对象接收参数  程序中只接受我们需要的数据
    @RequestMapping("paramc")
    public Staff  paramc(Staff staff){
        return staff;
    }
    //获取地址上的参数
    @RequestMapping("paramd/{id}")
    public String paramd(@PathVariable Integer id, HttpServletRequest request){
        String username=request.getParameter(("username"));
        return "接收到的参数是:"+id;
    }
    //作用域对象:page HttpServletrequest Httpsession  (ServletContext)application
    //接受前端的参数
    public static void getparam(){

    }
}
package com.easy.controller;

import com.easy.bean.Staff;
import com.easy.common.CommonResult;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
//@RequestMapping("staff")
public class StaffController {
    @GetMapping("staff")
    public CommonResult getList(Staff staff){
        List<Staff> list=null;
        System.out.println("获取数据");
        return CommonResult.success(list);
    }
    @PostMapping("staff")
    public CommonResult addstaff(Staff staff){
        System.out.println("新增数据");
        return CommonResult.success();
    }
    @DeleteMapping("staff/{id}")
    public CommonResult delstaff(@PathVariable int id){
        System.out.println("删除数据"+id);
        return CommonResult.success();
    }
    @PutMapping("staff")
    public CommonResult editstaff(Staff staff){
        System.out.println("编辑数据");
        return CommonResult.success();
    }
    @GetMapping("ex")
    public CommonResult ex(){
        int a=12/0;
        return CommonResult.success();
    }
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public CommonResult exh(){
        return CommonResult.success(200,"稍有问题");
    }
}

转发和重定向

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

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 {
    //转发forward:同一个服务器中不同的服务进行转发
    //浏览器发送了一个请求 可以转发到项目中受保护的资源
    //比如web-inf
    //转发是request对象执行forward方法
    //重定向redirect:可以在不同的服务之间跳转
    //浏览器发送两次请求
    //重定向是通过response对象通知浏览器重新访问(redirect)
    @RequestMapping("methodA")
    public String methodA(){
        System.out.println("---------methodA");
        //return "forward:/methodB";
        return "redirect:/methodB";
    }
    @RequestMapping("methodB")
    @ResponseBody
    public String methodB(){
        System.out.println("----------methodB");
        return "this is methodB";
    }
    @RequestMapping("methodC")
    public String methodC(){
        System.out.println("--------methodC");
        return "index.jsp";
    }
}

运行原理及关键技术点:
拦截器:通过实现 HandlerInterceptor 接口来拦截请求和处理。
异常处理机制:通过 @ExceptionHandler 和 @ControllerAdvice 实现全局异常处理和局部异常处理。

拦截器(Interceptor)
拦截器是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段执行预处理和后处理操作。实现了 HandlerInterceptor 接口,该接口定义了三个主要方法:

preHandle:

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
功能:在请求处理之前被调用,可以进行请求拦截、权限校验等操作。
返回值:
true:继续执行后续的拦截器和处理器(Controller)。
false:阻止后续的拦截器和处理器执行,请求处理流程中断。
postHandle:

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
功能:在请求处理之后,视图渲染之前调用。可以通过 ModelAndView 对象对请求进行进一步处理或修改。
afterCompletion:

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
功能:在整个请求处理完成后调用,即视图渲染完毕后。通常用于进行资源清理操作,例如释放资源、记录日志等。
异常处理
异常处理是在控制器处理请求过程中可能抛出异常时的处理机制。Spring MVC 提供了几种处理异常的方式:

局部异常处理:在控制器类中使用 @ExceptionHandler 注解处理特定异常类的异常。
全局异常处理:通过在整个应用范围内定义 @ControllerAdvice 类来处理全局异常。
通常在全局异常处理中,可以定义多个 @ExceptionHandler 方法来处理不同类型的异常,或者对未处理的异常进行统一处理和记录。

package com.easy.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class EasyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("---------preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("---------preHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("------------afterCompletion---整个请求处理完毕");
    }
}

springmvc 运行原理

DispatcherServlet :

入口点:所有的请求都经过 DispatcherServlet,它是 Spring MVC 的核心控制器。
责任:负责请求的转发和处理,它将请求分发给合适的处理器(Handler)进行处理,并将处理结果返回给客户端。
HandlerMapping 的作用:

定位处理器:DispatcherServlet 通过 HandlerMapping 来确定请求所对应的处理器(Controller)。
HandlerMapping 实现:Spring MVC 提供多种 HandlerMapping 的实现,包括基于 URL 的映射、注解映射等,以匹配请求到具体的处理器。
Controller 的角色:

请求处理:Controller 是实际处理请求的地方,它们使用 @Controller 或 @RestController 注解进行标识。
处理方法:Controller 中的方法通过 @RequestMapping 或其他注解映射特定的请求路径和请求方法,处理请求并返回响应数据。
HandlerAdapter 的作用:

适配处理器:HandlerAdapter 将请求交给 Handler(Controller) 进行处理,并负责调用合适的方法。
多样性支持:Spring MVC 提供了不同的 HandlerAdapter 实现,用于支持不同类型的处理器方法。
ViewResolver 和视图解析:

视图解析:处理完请求后,DispatcherServlet 通过 ViewResolver 将逻辑视图名解析为实际的视图。
返回结果:视图负责渲染最终的输出,然后返回给客户端。
拦截器和异常处理:

拦截器:通过 HandlerInterceptor 可以在请求处理的不同阶段执行预处理和后处理操作。
异常处理:通过 @ExceptionHandler 或全局异常处理器 @ControllerAdvice 可以统一处理控制器中抛出的异常

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

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

相关文章

I2C 设备驱动编写流程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、修改设备树1、 IO 修改或添加2、在 i2c1 节点追加 ap3216c 子节点3、查看设备树节点创建是否成功 二、AP3216C 驱动编写 前言 提示&#xff1a;这里可以添…

9.11 与 9.9 哪个大? 大模型幻觉从何而来?用最通俗的例子讲清楚大模型原理。

​如下图&#xff0c;我们使用用 gpt-4-turbo 模型为例&#xff0c;问9.11 与 9.9 哪个大&#xff0c;并让他一步一步给出分析步骤。你会发现&#xff0c;它开始了胡说八道&#xff0c;这就是“大模型幻觉” 。 那么问题来了&#xff0c;为什么会出现这种结果&#xff1f;幻觉从…

【Python代码】如何在多个Excel文件中高效找出含有特定关键词的文件?

点击上方"蓝字" 关注木易巷&#xff01; 哈喽&#xff0c;大家好&#xff0c;木易巷来啦&#xff01; 想象一下&#xff0c;如果你有一个文件夹&#xff0c;里面堆满了近百个Excel文件&#xff0c;你需要从中找出包含特定关键词文本的文件。文件格式不统一&#xf…

仓颉语言 -- 宏

使用新版本 &#xff08;2024-07-19 16:10发布的&#xff09; 1、宏的简介 宏可以理解为一种特殊的函数。一般的函数在输入的值上进行计算&#xff0c;然后输出一个新的值&#xff0c;而宏的输入和输出都是程序本身。在输入一段程序&#xff08;或程序片段&#xff0c;例如表达…

【OpenCV C++20 学习笔记】提取水平和垂直线条

提取水平和垂直线条 原理实操——去除五线谱的五线二进制化提取垂直对象完善边缘和最终输出图片黑白反转平滑 完整代码 其他图片元素提取实践提取水平线条提取音符轮廓 原理 在腐蚀和膨胀操作中&#xff0c;通过卷积核(kernel)&#xff0c;或者结构元素(structuring element)&…

vue-router核心TS类型

NavigationFailureType 枚举&#xff1a; export declare enum NavigationFailureType {/*** An aborted navigation is a navigation that failed because a navigation* guard returned false or called next(false)*/aborted 4,/*** A cancelled navigation is a navigati…

arduino程序-MC猜数字5、6(基础知识)

arduino程序-MC猜数字5、6&#xff08;基础知识&#xff09; 1-23 MC猜数字-5 自定义函数自定义函数自定义清理显示内容函数displayClear&#xff08;&#xff09;带参数函数displayNumber带参数、返回值的函数 1-24 MC猜数字-6 完成制作显示0~9数字函数改造产生随机数字函数改…

嵌入式人工智能(42-基于树莓派4B的红外遥控)

1、简介 红外遥控想必对大家来说都不陌生&#xff0c;红外也属于无线通信的一种&#xff0c;只要是无线通信&#xff0c;必然要用电磁波&#xff0c;要理解无线通信的本质和原理&#xff0c;不管用哪个频段都要学习电磁场与电磁波&#xff0c;这是一个难度很大的课&#xff0c…

IT事件经理在数字企业中的角色和责任

什么是IT事件经理&#xff1f; IT事件经理有时也被称为事件指挥官&#xff0c;他们承担着管理组织事件响应的总体责任&#xff0c;从委派各种事件响应任务到与每个利益相关者进行沟通和协调。 示例&#xff1a;当一个全球性的电子商务平台在一次销售活动中流量激增&#xff0c…

George Danezis谈Mysticeti的共识性能

Sui的新共识引擎Mysticeti已经在主网上开始分阶段推出。Mysten Labs联合创始人兼首席科学家George Danezis在采访中&#xff0c;讨论了其低延迟如何通过高性能应用程序提升用户体验。 采访视频&#xff1a; https://youtu.be/WHvtPQUa2Q0 中文译文&#xff1a;延迟和吞吐量对…

LSTM与GNN强强结合!全新架构带来10倍推理速度提升

今天来推荐一个深度学习领域很有创新性的研究方向&#xff1a;LSTM结合GNN。 GNN擅长处理图数据关系和特征&#xff0c;而LSTM擅长处理时间序列数据及长期依赖关系。通过将两者结合&#xff0c;我们可以有效提升时间序列预测的准确性和效率&#xff0c;尤其是在处理空间和时间…

手搓交换排序、归并排序、计数排序

文章目录 交换排序冒泡排序快速排序hoare版本挖坑法lomuto前后指针 非递归快速排序 归并排序实现计数实现排序代码测试排序算法性能 交换排序 冒泡排序 void BubbleSort(int* arr, int n) {for (int i 0; i < n; i){int flag 0;for (int j 0; j < n - i - 1; j){if …

day13 Java基础——逻辑运算符,位运算符及面试题

day13 Java基础——逻辑运算符&#xff0c;位运算符及面试题 1. 逻辑运算符&#xff1a;与&#xff0c;或&#xff0c;非 package operator;public class Demo07 {public static void main(String[] args) {boolean a true;boolean b false;System.out.println("a &…

【网络问题】网络诊断:远程计算机或设备将不接受连接的解决办法/DNS服务器可能不可用

当网络出现问题时&#xff0c;一定要点击“请尝试运行Windows网络诊断”来获取具体的网络问题&#xff0c; 今天碰到且得以解决的两个问题&#xff1a; 一、远程计算机或设备将不接受连接的解决办法 打开控制面板——点击“网络和Internet”——点击“Internet选项”&#xf…

电脑自动重启是什么原因?重启原因排查和解决办法!

当你的电脑突然毫无预警地自动重启&#xff0c;不仅打断了工作流程&#xff0c;还可能导致未保存的数据丢失&#xff0c;这无疑令人很懊恼&#xff0c;那么&#xff0c;电脑自动重启是什么原因呢&#xff1f;有什么方法可以解决呢&#xff1f;别担心&#xff0c;在大多数情况下…

《从零开始:使用Python构建简单Web爬虫》

前言 随着互联网信息的爆炸性增长&#xff0c;如何高效地获取和处理这些数据变得越来越重要。Web爬虫作为一种自动化工具&#xff0c;可以帮助我们快速抓取所需的网页内容。本文将介绍如何使用Python编写一个简单的Web爬虫&#xff0c;并通过实例演示其基本用法。 准备工作 …

创建互动照片墙:HTML、CSS 和 JavaScript 实战

在这个数字化时代&#xff0c;照片已经成为我们生活中不可或缺的一部分。无论是记录重要时刻&#xff0c;还是分享日常生活&#xff0c;我们都离不开照片。今天&#xff0c;我们将一起探索如何使用 HTML、CSS 和 JavaScript 创建一个互动的照片墙程序&#xff0c;让您可以轻松展…

四步构建App跨渠道归因分析方法

通常来讲&#xff0c;在互联网场景中&#xff0c;最简单也最常用的App归因模型就是基于最后一次点击来源进行归因转化&#xff0c;因为越靠近决策环节的时刻通常影响就越大。 不过有机构对营销测量的研究发现&#xff0c;只有11%的营销人员对他们的归因模型的准确性感到“非常…

大语言模型(LLM)快速理解

自2022年&#xff0c;ChatGPT发布之后&#xff0c;大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;简称LLM掀起了一波狂潮。作为学习理解LLM的开始&#xff0c;先来整体理解一下大语言模型。 一、发展历史 大语言模型的发展历史可以追溯到早期的语言模型…

视频孪生:如何有效利用智慧机房里的视频监控系统?

机房是存储设备和数据的重要场所。常见的机房安全隐患有电源不稳定、设备温度异常、空调及新风系统故障、机房漏水等&#xff0c;因此需要管理人员全天轮班值守巡检。传统机房运维工作繁琐且效率低下&#xff0c;对监控设备的利用率不高&#xff0c;而视频孪生技术能很好地解决…