Spring+SpringMVC+SpringBoot

news2024/11/15 5:07:35

Spring

bean

bean基础配置

bean别名配置

注意事项:

获取bean无论是通过id还是name获取。如果无法获取到,将抛出异常NoSuchBeanDefinitionException

bean的作用范围配置

适合交给容器进行管理的bean

表现层对象、业务层对象、数据层对象、工具对象

不适合交给容器进行管理的bean

封装实体的域对象

bean实例化的三种方式

bean实例化--构造方法

提供可访问的构造方法

配置

无参构造方法如果不存在,将抛出异常BeanCreationException

bean实例化--静态工厂(了解)

静态工厂

配置

bean实例化--实例工厂与FactoryBean(了解)

实例工厂

配置

FactoryBean

配置

bean的生命周期

生命周期:从创建到消亡的完整过程

bean生命周期:bean从创建到销毁的整体过程

bean生命周期控制:在bean创建后到销毁前做一些事情

提供生命周期控制方法

控制生命周期控制方法

核心容器

依赖注入方式

setter注入

构造器注入

自动装配

集合注入

  

加载properties文件

1.开启context命名空间

2.使用context空间加载properties文件

3.使用${}读取加载的属性值

加载properties文件

容器

容器初始化,创建容器

获取bean

容器类层次结构图

核心容器总结

容器相关

bean相关

依赖注入相关

注解

注解开发bean

纯注解开发模式

1.定义bean

@Component是通用的

@Controller

@Service

@Repository

2.纯注解开发

@Configuration注解用于设定当前类为配置类

@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式

//加载配置文件初始化容器

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

变为

//加载配置类初始化容器

ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);

注解开发依赖注入

bean的作用范围

使用@Scope定义作用范围

使用@PostConstruct,@PreDestroy定义bean生命周期

@Scope("singleton")

    public class BookDaoImpl implements BookDao {
        public BookDaoImpl(){
            System.out.println("book dao constructor...");
        }

        @PostConstruct
        public void init() {
            System.out.println("init");
        }
        @PreDestroy
        public void destrop() {
            System.out.println("destrop");
        }
    }

注解开发依赖注入

使用@Autowired注解开启自动装配模式(按类型)
@Service
    public class BookServiceImpl implements BookService {
        @Autowired
        @Qualifier("bookDao")
        private BookDao bookDao;

        public void save() {
            System.out.println("book service save ...");
            bookDao.save();
        }
    }

注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法

注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法

使用@Qualifier注解开启指定名称装配bean
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;
}

注意:使用@Qualifier注解无法单独使用,必须配合@Autowired注解使用

使用@value实现简单注入
@Repository("bookDao")
    public class BookDaoImpl implements BookDao {
        @Value("itheima")
        private String name;
        public void save() {
            System.out.println("book dao save..." + name);
        }
    }

注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*

注解开发管理第三方bean

第三方bean管理

1.使用@Bean配置第三方Bean

@Configuration
    public class SpringConfig {
        //1.定义一个方法获得要管理的对象
        //2.添加@Bean,表示该方法的返回值是一个bean
        @Bean
        public DataSource dataSource(){
            DruidDataSource ds=new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
            ds.setName("root");
            ds.setPassword("root");
            return ds;
        }
    }

2.使用独立的配置类管理第三方Bean

将独立的配置类加入核心配置

方式一:导入式

public class jdbcConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        /*ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setName("root");
        ds.setPassword("root");*/
        //相关配置
        return ds;
    }
}

使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式

@Configuration
    @Import({jdbcConfig.class})
    public class SpringConfig {
    }

方式二:扫描式(不推荐)

@Configuration
public class jdbcConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        /*ds.setDriverClassName("com.mysql.jdbc.Driver");
		  ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
		  ds.setName("root");
		  ds.setPassword("root");*/
        //相关配置
        return ds;
    }
}

使用@ComponetScan注解扫描配置类所在的包,加载对应的配置类信息

@Configuration
    @ComponentScan("com.itheima.config")
    public class SpringConfig {
    }

注解开发实现为第三方bean注入资源

1.简单类型的注入
public class jdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/spring_db")
    private String url;
    @Value("root")
    private String userName;
    @Value("root")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setName(userName);
        ds.setPassword(password);
        //相关配置
        return ds;
    }
}
2.引用类型的注入
public class jdbcConfig {
    @Bean
    public DataSource dataSource(BookDao bookDao){
        System.out.println(bookDao);
        DruidDataSource ds=new DruidDataSource();
        //相关配置
        return ds;
    }
}

引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

@Configuration
    @Import({jdbcConfig.class})
    @ComponentScan("com.itheima")
    public class SpringConfig {

    }
@Repository("bookDao")
    public class BookDaoImpl implements BookDao { 
        public void save() {
            System.out.println("book dao save..." );
        }
    }

注解开发总结

XML配置对比注解配置

整合

spring整合mybatis

思路分析

MyBatis程序核心对象分析

核心对象为SqlSessionFactoryBuilder

整合MyBatis

整合MyBatis

添加坐标,版本号要匹配

添加配置类替换xml文件

具体替换:

spring整合JUnit

添加依赖坐标

使用Spring整合JUnit专用的类加载器:@RunWith(SpringJUnit4ClassRunner.class)

指定spring的配置:@ContextConfiguration(classes=SpringConfig.class)

要测谁就自动装配谁:@Autowired

AOP

AOP简介

AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构

作用:在不惊动原始设计的基础上为其功能进行功能增强

Spring理念:无入侵式/无侵入式

AOP核心概念

连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)

程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等

在SpringAOP中,理解为方法的执行

切入点:PoingCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。

匹配连接点的式子

在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)

在切入点出执行的操作,也就是共性操作

在SpringAOP中,功能最终以方法的形式呈现

切面:Aspect,描述通知与切入点的对应关系

通知类:定义通知的类

目标对象:Target,通知所应用的对象

原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的

代理:Proxy,目标对象无法直接完成工作,需要对其功能进行回填,通过原始对象的代理对象实现

AOP工作流程

1.Spring容器启动

2.读取所有切面配置中的切入点(只读取pt(),不读取ptx()

3.初始化bean,判定bean对应的类中的方法是否匹配到任意切入点

*匹配失败,创建对象

*匹配成功,创建原始对象(目标对象)的代理对象

4.获取bean执行方法

*获取bean,调用方法并执行,完成操作

*获取bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

AOP切入点表达式

切入点:要增强的方法

切入点表达式:要进行增强的方法的描述方式

描述方式一:执行com.itheima.dao包下的BookDao接口中的无参数update方法

execution(void com.itheima.dao.BookDao.update())

描述方式二:执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法

切入带你表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)

execution(public User com.itheima.service.UserService.findById(int))

动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点

访问修饰符:public,private等,可以省略

返回值

包名

类/接口名

方法名

参数

异常名:方法定义中抛出指定异常,可以省略

可以使用通配符描述切入点,快速描述

*:单个独立的任意符号,可以单独出现,也可以作为前缀或者后缀的匹配符出现

..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

+:专用于匹配子类类型

书写技巧

所有代码按照标准规范开发,否则以下技巧全部失效.

描述切入点通常描述接口,而不描述实现类.

访问控制修饰符针又书妾口开发均采用 public 描述(可省略访问控制修饰符描述).

返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述.

包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配.

接口名/类名书写名称与模块相关的采用*匹配,例如 Userservice 书写成* Service ,绑定业务层接口名.

方法名书写以动词进行精准匹配,名词采用*匹配,例如 getByld 书写成getBy*, selectAll 书写成 selectAll .

参数规则较为复杂,根据业务方法灵活调整.

通常不使用异常作为匹配规则

AOP通知类型

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

AOP通知共分为5种类型

前置通知

后置通知

环绕通知(重点)

返回后通知(了解)

抛出异常后通知(了解)

AOP通知获取数据

获取切入点方法的参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知

ProceedJoinPoint::适用于环绕通知

获取切入点方法返回值

返回后通知

环绕通知

获取切入点方法运行异常通知

抛出异常后通知

环绕通知

事务

事务简介

事务作用:在数据层保障一系列的数据库操作同成功同失败

Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败

1.在业务层接口上添加Spring事务管理

注意事项

Spring注解式事务通常添加在业务层接口中方而不会添加到业务层实现类中,降低耦合

注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务

2.设置事务管理器

注意事项

事务管理器要根据实现技术进行选择

MyBatis框架使用的是JDBC事务

3.开启注解式事务驱动

事务角色

事务角色

事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法,

事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

事务属性

事务传播行为:事务协调员对事务管理员所携带事务的处理态度

SpringMVC

SpringMVC简介

SpringMVC概述

SpringMVC技术与Servlet技术功能等同,均属于web层开发技术

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

优点:
使用简单,开发便捷(相比于Servlet)

灵活性强

SpringMVC是一种表现出框架技术

SpringMVC用于进行表现出功能开发

入门案例

1.使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标

2.创建SpringMVC控制器类(等同于Servlet功能)

3.初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

4.初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

注解

入门案例工作流程分析

启动服务器初始化过程

1.服务器启动,执行ServletContainersInitConfig类,初始化web容器

2.执行createServletApplicationContext方法,创建了WebApplicationContext对象

3.加载SpringMvcConfig

4.执行@ComponentScan加载对应的bean

5.加载UserController,每个@RequestMapping的名称对应一个具体的方法

6.执行getServletMappings方法,定义所有的请求都通过SpringMVC

单次请求过程

1.发送请求localhost/save

2.web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理

3.解析请求路径/save

4.由/save匹配执行对应的方法save()

5.执行save()

6.检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方

Controller加载控制

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean——加载Spring控制的bean的时候排除掉SpringMVC控制的bean

SpringMVC相关bean加载控制

SpringMVC加载的bean对应的包均在com.itheima.controller包内

Spring相关bean加载控制

方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean

方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

请求与响应

请求映射路径

名称:@RequestMapping

类型:方法注解 类注解

位置:SpringMVC控制器方法定义上方

作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

范例:

属性 value(默认):请求访问路径,或访问路径前缀

SpringBoot

SpringBoot入门

SpringBoot入门程序

1.创建新模块,选择spring初始化,并配置模块相关基础信息

2.选择当前模块需要使用的技术集

3.开发控制器类

4.运行自动生成的Application类

最简SpringBoot程序所包含的基础文件

1.pom.xml

2.Application类

Spring程序与SpringBoot程序对比

基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构

SpringBoot官网创建方式

1.进入官网,点击Quickstart Your Project

2.进行配置

3.添加依赖

4.生成zip压缩文件

SpringBoot项目快速启动

1.对SpringBoot项目打包(执行Maven构建指令package)

2.执行启动指令

注意事项:jar执行命令行启动需要依赖Maven插件支持,请确认打包时是否具有SpringBoot对应的Maven插件

SpringBoot简介

起步依赖

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程

Spring程序缺点

配置繁琐

依赖设置繁琐

SpringBoot程序优点

自动配置

起步依赖(简化依赖配置)

辅助功能(内置服务器,......)

起步依赖

含start的为起步依赖

辅助功能之切换web服务器

辅助功能

SpringBoot程序启动

启动方式

SpringBoot在创建项目时,采用jar的打包方式

SpringBoot的引导类时项目的入口,运行main方法就可以启动项目

使用maven依赖管理变更起步依赖项

Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty

基础配置

配置文件格式

修改服务器端口

SpringBoot提供了多种属性配置方式

1.application.properties

2.application.yml

3.application.yaml

自动提示功能消失解决方案

三种配置文件优先级

注意事项:

SpringBoot核心配置文件名为application

SpringBoot内置属性过度,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性

yaml

yaml格式

yaml语法规则

yaml数组数据

数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔

yaml数据读取方式

使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名......}

封装全部数据到Environment对象

自定义对象封装指定数据

注意事项

自定义对象封装数据警告解决方案

添加依赖

多环境启动

多环节开发配置

多环境启动

propertie文件多环境启动

多环节命令行启动参数配置

带参数启动SpringBoot

参数加载优先级顺序

多环节开发兼容问题

Maven与SpringBoot多环境兼容

1.Maven中设置多环境属性

2.SpringBoot中引用Maven属性

3.执行Maven打包指令

Maven指令执行完毕后,生成了对应的包,其中类参与编译,但是配置文件并没有编译,而是复制到包中

解决思路:对于源码中非java类的操作要求加载Maven对应的属性,解析${}占位符

4.对资源文件开启对默认占位符的解析

Maven打包加载到属性,打包顺利通过

配置文件分类

配置文件分类

在SpringBoot中提供有多级配置文件

整合第三方技术

SpringBoot整合junit

Spring整合junit(复习)

SpringBoot整合junit

SpringBoot整合mybatis

SpringBoot整合SSM

Spring整合mybatis(复习)

1.SpringConfig

导入JdbcConfig

导入MyBatisConfig

2.JDBCConfig

定义数据源(加载properties配置项:driver、url、username、password)

3.MyBatisConfig

定义SqlSessionFactoryBean

定义映射配置

SpringBoot整合MyBatis

1.创建新模块,选择Spring初始化,并配置模块相关基础信息

2.选择当前模块需要使用的技术集(MyBatis、MySQL)

3.设置数据源参数

注意事项:

SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区

或在MySQL数据库端配置时区解决此问题

4.定义数据层接口与映射配置

5.测试类中注入dao接口,测试功能

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

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

相关文章

【数学知识】LCP42: 玩具套圈

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的基础知识点 优化后,就不需要二分了。 二分查找算法合集 题目 「力扣挑战赛」场地外,小力组织了一个套玩具的游戏。所有的玩具摆在平地上,toys…

开源BI 平台AJ-Report —— 筑梦之路

AJ-Report: AJ-Report是一个完全开源,拖拽编辑的可视化设计工具。三步快速完成大屏:配置数据源---->写SQL配置数据集---->拖拽生成大屏。让管理层随时随地掌控业务动态,让每个决策都有数据支撑。

[渗透测试学习] Sau - HackTheBox

首先是信息搜集,nmap扫一下 nmap -sV -sC -p- -v 10.10.11.224 发现存在两个端口,55555端口有http服务,访问一下 获得线索request-baskets版本为1.2.1,搜索发现存在漏洞 那么我们试试构造ssrf,create的时候bp抓包 构…

【教程】源代码加密、防泄密软件

​ 什么是代码混淆? 代码混淆 是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。 …

PyQt6 QFrame分割线控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

Vue3-20-组件-父组件给子组件传值

情景说明 当父组件使用子组件的时候, 我们可能会需要将某些父组件的变量值 传递 给 子组件,在子组件中进行使用。此时就有一个 【父组件】传值给【子组件】的动作。 这就是本文我们要讨论的问题。主要问题有两个 : 1、【子组件】 如何接收值…

Zoho Desk与Zendesk详细对比:热门在线客服系统之争

企业需要一款功能强大且丰富的客服系统产品为其解决客户服务的难题。对于了解过Zendesk的企业来讲,可能会考虑到还有哪些产品可供选择,便于对比选择出更合适的产品。这篇文章就为大家展现了一款和Zendesk功能相似的产品——Zoho Desk,在功能、…

辅助电源交流220V转5V200mA输出,不需要变压器

辅助电源交流220V转5V200mA输出,不需要变压器。 在当今智能家居、小家电等电子产品日益普及的时代,对辅助电源的需求也越来越大。一款高效、低成本、小巧封装的辅助电源芯片成为众多产品的迫切需求。今天,我们将为您介绍一款交流220V转5V200m…

CDN初学习

目录 1、CDN是什么 2、CDN管理中心 3、CDN 的工作原理 4、如何保证CDN的内容缓存和分发的可靠性? 5、cdn的应用场景 6、使用CDN服务时,需要注意哪些问题? 1、CDN是什么 CDN是Content Delivery Network的缩写,也被称为内容分…

接口测试 — 4.Requests库GET、Post请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 (不带参数的GET请求请看上一篇文章的练习) 1、Requests库待参数的GET请求 使用Get方法带参数请求时,是params参数字典,而不是data参数字典。data参数字典…

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自: 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

DDD、SOA、微服务和微内核

DDD、SOA、微服务和微内核,看到经常有人把这几个概念拿出来一起讲。事实上,DDD和其他三个不是一个维度的东西。 DDD其实特别好理解,DDD就是领域来驱动设计嘛,是一种设计思想。很容易又和OOA、OOD和OOP来比较了。这个回头再说。 SO…

世微 AP9166 DC-DC降压IC 18V 2A同步降压转换器

600KHz,18V,2A同步降压转换器 概述 AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率 负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制,允许更宽范围的高效率 负载AP9166至少需要现成标准的…

JVM的内存分区以及垃圾收集

1.JVM的内存分区 1.1方法区 方法区(永久代)主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 1.2虚拟机栈 虚拟机栈也就是我们平时说的栈内存,它是为java方法服务的。每个方法在执行的…

mysql踩坑

关于安装 1报错:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client具体代码如下: import mysql from "mysql"//连接数据库 const dbmysql.createPool({h…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进,更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境,很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中,以…

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考: 1.下载 根据服务器操作系统版本,下载对应的RPM包。 gitlab官网: The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

阿里云人工智能平台PAI多篇论文入选EMNLP 2023

近期,阿里云人工智能平台PAI主导的多篇论文在EMNLP2023上入选。EMNLP是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究,尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

Java 线程运行方法和原理

线程运行 原理 栈与栈帧&#xff1a; Java 虚拟机栈会为每个启动的线程分配一块栈内存&#xff0c;其中存储着栈帧&#xff08;Frame&#xff09; 每个栈由多个栈帧组成&#xff0c;栈帧对应调用方法&#xff08;函数&#xff09;所占用的内存每个栈只有一个活动栈&#xf…