StudyStudyStudy第十六天(2024.8.2)

news2024/9/23 0:40:01

1.代理模式

代理模式分为静态代理和动态代理

代理模式,就是在想要执行的代码之前或之后添加代码块,并不会破坏原有的代码结构。可以理解成加上了一个访问层

1.静态代理

创建一个接口Shopping

public interface Shopping {
    void shopping();
}

创建一个EasyA类实现接口Shopping,重写shopping方法

public class EasyA implements Shopping{
    @Override
    public void shopping() {
        System.out.println("去购物");
    }
}

创建一个Proxy类,实现接口,重写shopping方法 

public class Proxy implements Shopping{
    Shopping s;
    public Proxy(Shopping s){
        this.s=s;
    }
    @Override
    public void shopping() {
        System.out.println("--------- 一支穿云箭");
        s.shopping();
        System.out.println("--------- 千军万马来相见");
    }
}

创建一个工厂类,主函数在这个类中演示

public class Factory {

    public static Shopping getShopping(){
        EasyA a=new EasyA();
        Shopping s=new Proxy(a);
        return s;
    }

    public static void main(String[] args) {
        Shopping shopping = getShopping();
        shopping.shopping();
    }
}

最终效果为:

 可以将两段输出-----,想象成添加的访问层

静态代理的优点:1.易于理解

静态代理的缺点:1.代码冗余  2.不易维护

2.动态代理

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

创建一个接口 EasyInterface

public interface EasyInterface {
    void easy();
}

创建一个类实现接口

public class EasyObj implements EasyInterface{
    @Override
    public void easy() {
        System.out.println("---- 正常业务逻辑");
    }
}

 创建第二个类(被代理对象,必须实现接口)

public class EasyInvocationHandler implements InvocationHandler {
    private Object proxyedObj;//被代理对象
    EasyInvocationHandler(Object proxyedObj){
        this.proxyedObj=proxyedObj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=null;//定义方法的返回对象

        System.out.println("----执行方法之前添加的业务");
        //正常执行业务逻辑
        result=method.invoke(proxyedObj,args);
        System.out.println("----执行方法之后的处理");
        return result;
    }
}

 创建一个工厂类:

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的实例");
        }
        Class c=obj.getClass();
        System.out.println(c);

        EasyA easya=new EasyA();
        obj=getproxy(easya);
        System.out.println(obj.getClass());
    }
}

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

@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("----postHandle");

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("----afterCompletion--整个请求处理完毕");
    }
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Autowired
    EasyInterceptor easyInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(easyInterceptor).addPathPatterns("/methodc");
    }
}

 2.AOP

定义:

AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。

作用:

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离

AOP中一些专业术语:

Spring AOP中通知的分类: 

 3.SpringMVC

1.两种Controller注解的区别

两种Controller注解分别为:@Controller     @RestController

当在类上写@Controller注解时,类中被标注为@RestMapping的方法的返回值,会被识别为地址,即我们在网址栏填写的地址。

当在类上写@RestController注解时,类中被标注为@RestMapping的方法的返回值,会被识别为返回内容。

2.@RestMapping注解

1.注解在方法时

当在类中方法标识上@RestMapping注解,在网站输入框中输入 http:/localhost:8080/注解地址,就会跳转到地址页

@RestController //Rest  请求资源状态转换
public class EasyDController {
    @RequestMapping("nice")
    public String nice(){
        return "NICE METHOD";
    }
}

 

2.注解在类时 

注解在类时,需要在地址栏先输入父层地址,再输入子层地址

@RestController //Rest  请求资源状态转换
@RequestMapping("user")
public class EasyDController {
    @RequestMapping("nice")
    public String nice(){
        return "NICE METHOD";
    }
}

 

3.@PathVariable注解

不添加@PathVariable注解时需要在地址栏按实参填入

@RestController //Rest  请求资源状态转换
@RequestMapping("user")
public class EasyDController {
    //接收前端的参数   方法的参数名称和前台传递的参数名一样才可以接收到
    @RequestMapping("parama")
    public String paramA(String name){
        return "SpringMVC接收到的参数是:"+name;
    }

}

 

在方法参数列表中填入,在地址栏就不需要按照实参名称输入值

    @RequestMapping("paramd/{id}")
    public String paramd(@PathVariable Integer id, HttpServletRequest request){
        String username = request.getParameter("username");
        return "接收到的参数是:"+id+"----username="+username;
    }

 4.请求转发 和 重定向 的区别

1.请求转发:

同一个服务器中不同的服务进行转发,浏览器发送了一个请求,可以转发到项目中受保护的资源WEB-INF         转发是request对象执行forward方法

@Controller
public class EasyEController {
    @RequestMapping("methoda")
    public String methodA(){
        System.out.println("----methodA");
        return "forward:/methodb";
    }
    @RequestMapping("methodb")
    @ResponseBody
    public String methodB(){
        System.out.println("----methodB");
        return "this is methodb";
    }
}

 注意地址栏为localhost:8080/methoda,说明是先访问到methoda,在methoda下的方法中请求转发到了methodb,显示的是methodb中方法的内容

2.重定向:

可以在不同的服务之间跳转,浏览器发送两次请求,重定向是通过response对象通知浏览器重新访问   执行的是redirect方法

@Controller
public class EasyEController {
    @RequestMapping("methoda")
    public String methodA(){
        System.out.println("----methodA");
        return "redirect:/methodb";
    }
    @RequestMapping("methodb")
    @ResponseBody
    public String methodB(){
        System.out.println("----methodB");
        return "this is methodb";
    }
}

注意此时的地址栏,我们访问的是 localhost:8080/methoda,但是访问后却变成了localhost:8080/methodb,说明在我们访问methoda时,我们的访问请求直接重定向到了methodb

4.SpringMVC 运行原理

我们的MVC,即Model   View   Controller,在下面的图中有体现

 

 5.拦截器

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

@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("----postHandle");

    }

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

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

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

相关文章

笔记:唐老师讲电赛之唐老师讲电子器件(1)电阻 参数与选型

电阻 a . 精度 电阻----运放中的电阻要选精度高的,一般0.1% 若在设计电路中电路参数由某个电阻决定,则需要选取高精度电阻。例如,反向放大器等对于反馈系数、增益等参数完全由电阻决定的,则需要选取精度较高的电阻,…

PDF文件点击打印无反应?是何原因造成能解决吗?

PDF无法打印怎么处理?在我们工作中,经常会遇见各种各样的文件问题,当我们想要将PDF文件打印出来纸质版使用,却不知什么原因,显示PDF无法打印,这时应该怎么处理呢? 一般情况下,PDF文件…

园区运营管理系统是如何提升园区管理水平和运营效率的?

随着大数据、人工智能等新一代信息技术的迅猛发展,园区运营管理系统逐渐成为提升园区运营效率的重要工具。园区运营管理系统涵盖了运营监测、企业管理、企业服务、项目管理、资产管理、智能办公、物业管理、集成监控等核心功能,利用这些功能可以大幅提升…

Ecovadis认证标准|Ecovadis认证是什么

三分钟内,让我们深入探索Ecovadis认证的广阔世界,这是一场绿色革命中的璀璨明珠,引领着全球企业迈向可持续发展的新纪元。 Ecovadis认证,犹如绿色经济浪潮中的一盏明灯,它不仅照亮了企业责任与环保实践的融合之路&…

动态申请的二维数组不是连续的

在初学阶段,曾学过二维数组的内存空间是连续分布的,参考下图: 后来由于动态申请二维数组的方法不常用(一般都是用vector或者直接定义一个二维数组),所以就一直以为二维数组的内存空间是连续的。但实际上&a…

OpenCV仿射变换实现图像扭曲与旋转

目录 1. 仿射变换 2. 仿射变换的求解 3. 代码实现 3.1 图像扭曲 3.2 图像旋转 参考内容 1. 仿射变换 仿射变换是一种可以表达为乘以一个矩阵(线性变换)再加上一个向量(平移)的变换。在几何中,就是将一个向量空间…

天空NFT源码:数字藏品交易平台,铸造市场转售盲盒商城系统,附搭建教程和视频

🌟【火热NFT数藏交易平台源码限时!】🚀 👾 想进军NFT市场却苦于无门? 🎨 梦想拥有自己的数字藏品平台? 🛠️ 寻找全方位、无加密、易搭建的NFT解决方案? 🔥…

postman查询单条数据Get方法,无任何输出,idea后端也没有任何数据和提示的解决方法

问题描述: 正常使用postman测试,输入内容没有错误,但是却没有任何消息 后端也是,没有任何消息: 解决方法: 问题的原因主要是因为postman: 我们只需要新建一个页面,把刚才的查询语…

Spring Controller接口地址的骚玩法,很有用!

一,背景 项目里有一个接口需要对外提供,对方的解析方式有不同的方式,一个是使用流行的json格式,另外一个却是老系统,只能用xml格式,但是接口内部的实现逻辑是完全一样的,为了适配更多调用方的需…

AS400==创建主机,使用客户端连接上主机

因为AS400基于的CPU架构和自己用的PC不一致,所以要么自己买台AS400主机/上云服务买一台,或者去些网站免费申请一台。 申请地址 PUB400.COM - Your public IBM i server 注册成功后获取到账号密码 然后下载客户端 TN5250 Terminal Emulation for Win…

10. 计算机网络HTTP协议

1. 前言 无论是作为后端开发、前端开发、测试开发程序员或者是运维人员,在面试过程中,大概率都会被问到 HTTP 协议相关题目。 因为伴随着 2010 年之后移动互联网在全世界的高速发展,各种各样的浏览器(Chrome、FireFox、Safari 等)层出不穷,也诞生了诸多服务端开发的语言…

全志Tina_NPU开发部署说明

1 前言 1.1 读者对象 本文档(本指南)主要适用于以下人员: • 技术支持工程师 • 软件开发工程师 • AI 应用案客户 2 正文 2.1 NPU 开发简介 • 支持int8/uint8/int16 量化精度,运算性能可达1TOPS. • 相较于GPU 作为AI …

关于CSDN登录失效,频繁弹到登录界面

典型特征: 访问其它任何网站都没问题,就是访问任何一个和CSDN有关的网页都会弹到登录界面,且提示认证失败或者Cookies失效等。 刚才我照旧打开CSDN时,CSDN弹出重定向失败,提到了Cookies问题,在个人中心也弹…

ECCV 2024|是真看到了,还是以为自己看到了?多模态大模型对文本预训练知识的过度依赖该解决了

随着大型语言模型(LLMs)的进步,多模态大型语言模型(MLLMs)迅速发展。它们使用预训练的视觉编码器处理图像,并将图像与文本信息一同作为 Token 嵌入输入至 LLMs,从而扩展了模型处理图像输入的对话…

移动UI:活泼风格如何识别,有什么应用场景。

在移动UI设计中,活泼风格通常具有以下特征: 1. 鲜艳的色彩: 活泼风格的移动UI通常采用鲜艳、明快的色彩,如橙色、黄色、绿色等,以增加活力和生机。 2. 元素动画: 活泼风格的UI设计通常包含丰富的动画效…

无缝融入,即刻智能[2]:MaxKB内置强大工作流引擎,编排AI工作流程,满足多样化业务需求

无缝融入,即刻智能[2]:MaxKB内置强大工作流引擎,编排AI工作流程,满足多样化业务需求 1.简介 MaxKB(Max Knowledge Base)是一款基于 LLM 大语言模型的开源知识库问答系统, 官方网址:https://maxkb.cn/ GitHub:https://github.com/1Panel-dev/MaxKB 1.1 产品优势 开箱即…

嵌入式Linux系统中LCD屏驱动框架基本实现

大家好,今天主要给大家分享一下,如何使用linux系统中LCD屏驱动框架Framebuffer编写具体的代码。 第一:如何编写字符设备驱动程序 1、驱动框架基本操作: 驱动主设备号 * 构造file_operations结构体,填充open/read/write等成员函数 * 注册驱动:register_chrdev(major, name…

C#中WebView2调用与交互实现

简要说明: 此控件实际上是 [WebView2 COM API] (https://aka.ms/webview2) 的包装器。 可以通过访问 Microsoft.Web.WebView2.Wpf.WebView2.CoreWebView2 属性来直接访问基础 ICoreWebView2 接口及其所有功能。 一些最常见的 COM 功能也可以…

解决k8s flannel网络插件国内镜像docker拉取不到问题

一、准备下载资源 https://download.csdn.net/download/weixin_43205308/89608560 以下,每个k8s节点都要执行 二、载入镜像 解压上面的下载资源的文件夹后,会有图中的两个资源 载入资源 docker load --input flannel-flannel-v0.25.1-amd64.tar.gzd…

59在Linux中加docker中加mysql,tomcat,redis

一、引言 1.1 环境不一致 我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。 1.2 隔离性 哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自…