Spring框架概述

目录

1. Spring框架的起源

2. Spring框架的构成

3. Spring的发展历程

4. Spring的开发环境

4.1. Maven安装与配置

(1)Maven的下载与安装

(2)配置Maven的环境变量

(3)本地仓库的配置

(4)镜像仓库的配置

(5)创建Maven项目

(6)Maven项目的结构

(7)Maven项目的配置文件

4.2. Tomca的安装与配置

(1)Tomcat下载与安装

(2)Tomcat的启动

(3)解决中文乱码问题

(4)Tomcat端口的配置

(5)Web应用的配置

4.3.  集成开发环境

(1) IntelliJ IDEA下载和安装

(2)创建Maven Web项目

(3)配置Tomcat服务器

5. 初识Spring框架


      Spring框架是一个开源的Java平台,它通过提供一致的编程和配置模型,解决了企业应用开发中常见的复杂性问题。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向方面的编程(Aspect-oriented programming, AOP),它们共同提供了一种强大且灵活的方式来管理对象的依赖关系和增强对象的行为。

1. Spring框架的起源

        Spring框架起源于2002年,那时Java EE和EJB正风靡一时,许多大公司都采用这些技术进行项目开发。在当时背景下,Rod Johnson认为EJB过于庞大,不是所有项目都需要这样的重型框架,应有更优的解决方案。为了证明自己的观点,Rod Johnson写了《Expert One-on-One J2EE Development without EJB》一书,书的封面如图2所示。在书中,Rod Johnson介绍了Java企业应用程序开发情况,并指出Java EE和EJB组件框架中的一些主要缺陷,Rod Johnson还提出了一个基于普通的Java类和依赖注入的更简单的解决方案,另外,他还展示了如何在不使用EJB的情况下构建高质量、可扩展性的在线预留座位系统。

图1. Expert One-on-One J2EE Development without EJB

       为构建应用程序,Rod Johnson编写了超过30000行的基础结构代码,项目中的根包命名为com.interface21,这是Spring框架的前身,所以框架最初的名字叫interface21。2003 年 Rod Johnson 和同伴在此框架的基础上开发了一个全新的框架命名为Spring,Rod Johnson认为Spring 是传统J2EE新的开始,随后Spring框架的发展进入快车道。

       Rod Johnson 是一位杰出的软件工程师,他以创立Spring框架而闻名。Rod Johnson 在悉尼大学获得了计算机学和音乐学的双学位,后来还获得了音乐学博士学位。Rod Johnson在软件开发领域有着深远的影响,特别是在Java社区中。2009年,VMware以4.2亿美元收购了Spring Source,2012年,Rod Johnson宣布离开Spring Source,转而成为天使投资人和多家公司的董事,继续在技术和商业领域发挥影响力。

      Spring框架是由目前Pivotal团队维护的,Pivotal是一个提供云和大数据解决方案的公司,其前身是由Rob Mee于1989年创立的咨询公司Pivotal Labs。Pivotal Labs注于快速的互联网式软件开发,即敏捷编程。2012年,EMC公司收购了Pivotal Labs,并将其作为EMC的一个新部门,继续与以前的客户合作。2013年,EMC将Pivotal Labs 的核心业务分拆出去,成立了新的 Pivotal 公司,该公司的股东是 EMC 、 VMware 和通用电气。 Pivotal 公司负责维护的开源产品除了Spring及其衍生产品外,还有我们耳熟能详的Tomcat、Redis、RabbitMQ、Cloud Foundry、Greenplus和GemFire。Pivotal 公司成立之后,于 2014 年发布了 Spring Boot,2015 年发布了 Spring Cloud,2018 年 Pivotal 公司在纽约上市。

2. Spring框架的构成

       Spring框架由大约20个模块组成,这些模块按照功能可分为: 核心容器(Core Container)、面向方面编程(AOP和Aspects)、设备支持(Instrumentation)、数据访问及集成(Data Access/Integration)、报文发送(Message)Web和测试(Test),如图2所示。Spring框架中的各个模块可以独立使用,也可以几个模块进行组合。

图2. Spring框架的构成

(1)核心容器(Core Container)

     核心容器是由spring-beans、spring-core、spring-contextspring-expression(Spring Expression Language, SpEL)四个模块构成,提供Spring框架的基本功能。

      spring-beans和spring-core是Spring框架的核心模块,它提供了控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。BeanFactory接口是Spring框架中的核心接口,是工厂模式的实现。 BeanFactory使用IoC模式将应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。

       spring-context位于核心模块之上,它扩展了BeanFactory,为其添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。此外,它还提供了许多企业级的支持,例如,邮件访问、远程访问、任务调度等。

       spring-expression是统一表达式语言(EL)的扩展模块,它可以查询和管理运行中的对象,同时也可以方便地调用对象的方法,操作数组和集合等。

(2)面向方面编程(AOP、Aspects)

       Spring框架提供了面向方面的编程(AOP)能力,可以实现一些面向对象编程无法很好实现的功能,例如,将日志、事务与具体的业务逻辑解耦。AOP模块包含spring-aop、spring-aspects模块。 spring-aop是实现面向方面编程的核心模块。 spring-aspects模块集成自Aspect框架,主要为面向方面编程提供多种实现方法。

(3)仪器化支持(Instrumentation

       spring-instrument模块主要用于提供类的仪器化和类加载器的实现。类的仪器化允许Spring或其他框架在运行时修改类的字节码。spring-instrument模块提供了一个 Java 代理的实现,可以用来在加载时动态地仪器化类。这对于实现面向切面编程(AOP)等功能非常有用,可以动态地添加或改变应用程序的行为,而无需修改源代码。

(4)数据访问及集成(Data Access/Integration)

      Spring自带了一组数据访问框架,集成了多种数据访问技术。例如,JDBC、MyBatis、Hibernate、Java Persistence API(JPA)等。

      数据访问及集成模块包括:spring-jdbc、spring-tx、spring-orm、spring-jmsspring-oxm。spring-jdbc提供了JDBC访问支持,spring-tx实现事务控制, spring-orm提供了对象-关系映射的支持, spring-jms提供了消息的发送和接收功能, spring-oxm提供了从对象到XML映射的支持。

(5)Web

       spring-web模块由spring-web、spring-webmvc、spring-websocketspring-webflux构成,它为Web应用程序的开发提供支撑。

      spring-web模块为spring提供了最基础的Web支持,其通过Servlet或者Listeners来初始化IoC容器。spring-web模块实现了Spring MVCspring-websocket实现与Web前端的全双工通信协议。spring-webflux是一个新的非阻塞函数式Reactive Web框架,可以用来建立异步、非阻塞、事件驱动的服务。

(6)报文发送(Message)

       spring-message模块是从Spring 4开始加入的一个模块,专门用于处理国际化和本地化的消息和文本。这个模块提供了一种灵活的方式来定义和管理应用中的消息,使得支持多语言环境变得更加简单。

(7)测试(Test)

      spring-test模块主要用于提供支持和增强在 Spring 应用程序上进行单元测试和集成测试的功能。这个模块通过提供一系列的实用工具和注解来简化测试过程,使得开发者能够更加高效地编写和执行测试用例。

3. Spring的发展历程

      Spring自2002年由Rod Johnson提出概念以来,经历了多个重要的发展阶段,逐渐成为Java开发中最受欢迎的框架之一。Spring框架的主要发展历程如下:

  • 2003年Spring框架首次公开发布,版本为0.9。这个版本包括了核心容器、依赖注入、面向切面编程等基础功能。
  • 2004年发布Spring 1.0正式版,随后不久推出1.2版本,增加了对MVC框架的支持。
  • 2006年Spring 2.0发布,引入了基于XML的配置元数据支持和简化的XML命名空间。
  • 2007年:Spring 2.5发布,改进了对注解驱动开发的支持,引入了Spring Web Flow。
  • 2009年Spring 3.0发布,增加了对Java 5以上版本的支持,引入了注解驱动的开发和Java EE 6的支持。
  • 2013年Spring 4.0发布,全面支持Java 8,增强了对WebSocket和REST APIs的支持。
  • 2014年Spring Boot 1.0发布,目的是简化新Spring应用的引导和开发过程。Spring Boot提供了大量自动配置的功能,极大地简化了项目配置和依赖管理。
  • 2015年Spring Cloud项目启动,旨在提供在云平台上构建和部署微服务的工具和支持
  • 2017年Spring 5.0发布,引入了反应式编程模型,支持响应式APIs,增强了在异步和事件驱动环境下的性能。
  • 2019年Spring Boot 2.2发布,进一步增强了对微服务架构和云原生应用的支持
  • 2021年Spring Boot 2.5发布,持续优化和扩展功能,提升开发体验和性能。
  • 2022年:Spring 6.0发布,该版本基于 Java 17+,与最新的 Java EE 标准保持一致,提供了更好的兼容性和扩展性。

      Spring框架的发展不仅跟随了技术潮流,如从单体应用到微服务架构的转变,还积极引入新技术,如响应式编程和云原生支持,保持了其在Java开发社区中的领导地位。通过不断的迭代和改进,Spring使得Java开发更加高效、简洁和强大。在这个过程中,Spring生态系统也不断壮大。许多基于Spring的项目如Spring Security、Spring Data、Spring Cloud等都成为了Java开发中不可或缺的一部分。Spring框架的不断发展和完善,使其能够持续满足企业级Java应用开发的需求,并保持在技术创新的前沿。

4. Spring的开发环境

      Spring框架是采用Java语言开发,spring 5.0对Java要求的最低版本是Java 8。关于Java运行环境的安装与配置请阅读文章:开发Java应用程序,在此不做赘述。下面介绍项目管理工具Maven、Web服务器Tomcat以及Java集成开发环境(IDE)的安装与配置。

4.1. Maven安装与配置

       Maven是跨平台的项目管理工具,主要服务于Java平台的项目构建、依赖管理、项目信息管理。MavenApache下的一个开源项目,它包含了对象模型、标准集合、项目生命周期、依赖管理系统和用来运行定义在生命周期阶段的插件目标的逻辑。

(1)Maven的下载与安装

       打开Maven官方下载网址(https://maven.apache.org/download.cgi), 选择下载二进制归档zip文件(Binary zip archive):apache-maven-3.9.6-bin.zip,如图3所示。

图3. Maven的下载页面

       将下载的apache-maven-3.9.6-bin.zip文件解压缩到无中文和空格的路径下,这里选择D:\apache-maven-3.9.6,解压缩后的目录结构如图4所示。

图4. Maven的目录结构

(2)配置Maven的环境变量

       首先新建环境变量MAVEN_HOME,将其值设置为: D:\apache-maven-3.9.6,然后,编辑环境变量Path,将%MAVEN_HOME%\bin加入到Path中。

图5. MAVEN环境变量的定义

       在命令行方式下输入mvn-version命令,检测maven是否安装成功,如果输出下图的内容,则说明Maven安装成功。

(3)本地仓库的配置

       配置完Maven的环境变量之后,还需要修改本地Maven仓库的地址。Maven从远程仓库下载依赖包会存储在本地仓库中。需要手动修改配置文件setting.xml来配置本地仓库的地址,setting.xml文件位于Maven安装目录的conf文件夹下,例如,在面向的实例中,该文件位于D:\apache-maven-3.9.6\conf目录中。

打开settings.xml文件,看到文件的第53行内容,将53行复制并粘贴到55行,如下图所示。

       将localRepository标签内容换成自己的本地仓库地址。Maven推荐本地仓库地址设置为 :${user.home}/.m2/repository(见52行),其中,user.home为用户的主目录。例如,在Windows系统下,user.home的目录为C:\Users\fcmeng,则Maven的本地仓库地址为:C:\Users\fcmeng\.m2\repository,如下图所示。

      如果用户机器的C盘的空间有限,也可以将Maven的本地仓库地址改为其它地址。

(4)镜像仓库的配置

       Maven默认的官方镜像仓库是海外的,在国内下载速度非常慢,推荐使用阿里云提供的Maven镜像仓库,这样可以加快依赖包的下载速度和稳定性。

       可以添加阿里云的镜像到setting.xml文件中。首先,在setting.xml文件中找到mirrors节点,在其下添加mirror子节点,节点信息如下:

<mirror>

       <id>alimaven</id>

       <mirrorOf>center</mirrorOf>

       <name>aliyun maven</name>

       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

    </mirror>

添加上述子节点后的setting.xml文件内容如下:

(5)创建Maven项目

       利用maven内置插件Archetype的generate任务可以创建一个Java项目骨架。命令如下:

          mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}  -         

                                  DarchetypeArtifactId={ArchetypeId} -DinteractiveMode=false

      其中,

  • archetype是插件名称, generate是插件的一个任务,一个插件可以有很多任务,这里仅是产生骨架任务;
  • -DgrounpId:组织标识(包名);
  • -DartifactId:项目名称;
  • -DarchetypeArtifactId:指定ArchetypeId,即骨架类型;
  • -DinteractiveMode:是否使用交互模式。

     常用的项目骨架:

  • maven-archetype-quickstart创建Java一般项目
  • maven-archetype-webapp:创建Java Web项目

     集成开发环境中创建Maven项目也是调用maven内置插件Archetype来完成的。

(6)Maven项目的结构

       Maven项目有约定的目录结构,每个目录都有自己的含义,如图6所示。

图6. Maven项目的结构

(7)Maven项目的配置文件

       pom.xml是Maven项目的核心配置文件。项目本身的描述、项目依赖库、项目构建配置等与构建过程相关的一些设置都在这个文件中进行配置。

       pom的含义是项目对象模型(Project object model),其内容及其含义如图7所示。

图7. pom.xml文件

    可以在maven网站上查找并添加项目依赖的JAR包,Maven网站地址:https://mvnrepository.com/,其首页如下图所示。

图8. Maven网站

4.2. Tomca的安装与配置

       Tomcat是Apache组织的Jakarta项目中的一个重要子项目,它是Sun公司(已被Oracle收购)推荐运行ServletJSP的容器(引擎),其源代码是完全公开的。Tomcat不仅具有Web服务器的基本功能,还提供了数据库连接池等许多通用组件功能。

(1)Tomcat下载与安装

       Tomcat的版本不断更新,我们选择Windows 64位系统下10.1.23版的二进制归档文件:apache-tomcat-10.1.23-windows-x64.zip,

下载地址为:https://tomcat.apache.org/download-10.cgi,如图9所示。

图9. Tomcat的下载页面

       将下载的zip文件戒烟所的安装目录,这里为D:\tomcat\apache-tomcat-10.1.23,解压缩后的目录结构如下图所示。

图10. Tomcat的目录结构

各个目录的含义如下:

  • bin用于存放Tomcat的可执行文件和脚本文件。
  • conf:用于存放Tomcat的各种配置文件,如web.xmlserver.xml
  • lib:用于存放Tomcat服务器和所有Web应用程序需要访问的JAR文件。
  • logs:用于存放Tomcat的日志文件。
  • temp:用于存放Tomcat运行时产生的临时文件。
  • webapps:Web应用程序的主要发布目录,通常要将发布的应用程序放到这个目录下。
  • work:Tomcat的工作目录,JSP编译生成的Servlet源文件和字节码文件放到这个目录下。

(2)Tomcat的启动

        进图Tomcat安装目录的bin文件夹下,用鼠标双击startup.bat文件,便会启动Tomcat服务器,此时可以在命令行看到一些启动信息,如图11所示。

图11. Tomcat启动界面

       在启动Tomcat的过程,可能会遇到一种情况,即双击bin目录中的startup.bat脚本文件时,命令行窗口一闪而过。这时可以进入命令窗口,在该窗口执行startup.bat命令,就会看到错误信息显示在该窗口中。出现上述情况的主要问题可能是JAVA_HOME环境变量配置不正确。这是因为Tomcat服务器是由Java语言开发的,它在运行时需要根据JAVA_HOME环境变量来获取JRE的安装位置,从而利用Java虚拟机来运行Tomcat。要解决这个问题只需将JAVA_HOME环境变量配置成JDK的安装目录。

      Tomcat启动后,在浏览器的地址栏中输入http://localhost:8080或者http://127.0.0.1:8080,访问Tomcat服务器,如果浏览器中出现如图12显示的界面,则说明Tomcat服务器安装成功。

图12. Tomcat启动首页

(3)解决中文乱码问题

      Tomcat产生中文乱码的主要原因是编码与解码的方式不一致,可以通过如下方式解决。

  •  打开tomcat的/conf/server.xml,在Connerctor标签下给它增加UTF-8编码方式(第74行):

  • 打开tomcat的\conf\logging.properties,将日志的编码格式由UTF-8改为GBK(第51行):

(4)Tomcat端口的配置

       8080Tomcat服务器默认占用的端口,可以通过修改Tomcat服务器安装目录中conf文件夹下的主配置文件server.xml来更改端口号。打开server.xml文件,找到如下内容:

       将其中的port=“8080”更改为新的端口号,并重新启动Tomcat服务器即可,例如,将8080更改为9090等。

       如果Tomcat服务器所在的计算机没有启动占用80端口的其他网络程序,也可以将Tomcat服务器的端口设置为80,这样用户在访问Tomcat服务器时可以省略端口号,例如,http://localhost/

(5)Web应用的配置

       在Web服务器上运行的Web资源都是以Web应用形式呈现的,所谓Web应用就是多个Web资源的集合,Web应用通常也称为Web应用程序或Web工程。一个Web应用由多个Web资源或其他文件组成,其中包括HTML文件、CSS文件、JS文件、动态Web页面、Java程序、支持JAR包、配置文件等。开发人员在开发Web应用时,应按照一定的目录结构来存放这些文件,否则,在把Web应用交给Web服务器管理时,不仅可能会使Web应用无法访问,还会导致Web服务器启动报错。

       Tomcat服务器安装目录的webapps目录下的任何一个子目录都可以作为一个Web应用目录。例如,在webapps下新建myweb子目录,那么myweb就成为一个Web应用目录,如果将web1.html保存到myweb中,那么在浏览器中输入:http://localhost:8080/myweb/web1.html,就可以访问web1.html页面。

     在Tomcat中部署Web应用主要有四种方式:

  • 方式一:将web项目打包为WAR文件后拷贝到webapps目录中;
  • 方式二:将Web应用文件夹复制到Tomcat安装目录下的webapps文件夹中;
  • 方式三:打开Tomcat安装路径下的conf文件夹下的server.xml文件,在<Host></Host>元素中添加<Context>元素,例如,要配置D:\myWeb文件夹下的Web应用myweb1可以使用以下代码:<Context path=“/” docBase=“D:/myWeb/myweb1” reloadable=“true” >。
  • 方式四:在conf\Catalina\localhost目录下添加xml配置文件,任意命名只要和当前文件夹中的文件名不重复即可。

4.3.  集成开发环境

      目前,业界最常用的Java IDE工具是Eclipse和IntelliJ IDEA。Eclipse是开源免费的,IntelliJ IDEA提供了两个版本:旗舰版(Ultimate)和社区版(Community),其中,Ultimate是商业收费的,Community是免费的。对于在校的教师和学生,可以申请免费的IntelliJ IDEA Ultimate版本作为教学和学习使用。在这里,我们介绍如何利用IntelliJ IDEA Community创建和管理Maven项目。

(1) IntelliJ IDEA下载和安装

      IntelliJ IDEA的下载网址是:https://www.jetbrains.com/idea/download,我们选择IntelliJ IDEA Community Edition进行安装文件的下载,如图13所示。

图13. IntelliJ IDEA 下载页面

      下载完成后单击安装文件进行安装,安装结束后需要重启计算机。IntelliJ IDEA的启动界面如图14所示,默认的是黑色主题“Darclus”,在“Customize”选项中可以修改颜色主题。

 图14. IntelliJ IDEA的启动界面

(2)创建Maven Web项目

      点击启动界面中“New Project”按钮,进入创建项目界面,如图15所示,我们选择“Maven Archetypr”选项创建Maven项目。项目的名称为“mywebapp”,项目的位置是“E:\idea-workspace”目录,IDEA能够检测到机器安装的JDK,本机安装的JDK版本是20.0.2,在Archetype下拉列表中选择Maven项目的类型,在这里,我们选择“maven-archetype-webapp”,版本为1.0,点击“create”按钮开始创建Maven Web项目。由于需要从远程Maven仓库下载文件,所以创建过程会花费一段时间,请耐心等待!

图15. 创建项目界面

自动生成的项目结构如图16所示。

图16. Maven Web项目结构

     选择“File | Settings”菜单,进入Setting是界面,如图17所示,点击左侧树结构中的“Build, Excution, Deployent | Build Tools | Maven”节点,右侧显示Maven的配置信息。在Maven home path的下拉列表中,除了IDEA内置的Maven外,还检测到了用户安装的Maven。在这里,我们选择IDEA内置的Maven。

图17. Maven设置界面

(3)配置Tomcat服务器

     IDEA Community版本没有内置的Tomcat服务器插件,需要安装相应的插件。在Setting界面中点击左侧“Plugins”节点,进入插件安装界面,如图18所示,在查询栏中输入“tomcat”,选择Smart Tomcat进行安装。

      选择“Run | Edit Configurations”菜单,进入Run/Debug Configurations界面,点击“+”按钮,选择Smart Tomcat选项配置Tomcat,如图18所示,在Tomcat server的下拉列表中选择已安装的Tomcat的目录,在Catalina base中配置在Maven Web项目所使用的Tomcat的存放地址,在Deployment directory中配置Maven Web项目的Web应用目录,点击“OK”按钮保存Tomcat配置。

图18. 配置Tomcat

       启动Tomcat服务器,在浏览器中输入:http://localhost:8080/mywebapp,显示如下图所示界面,这说明Tomcat服务器配置成功。

图19. Maven Web项目默认首页

5. 初识Spring框架

      在pom.xml文件中增加如下依赖,然后,在项目上右击,在弹出的快捷菜单中选择Maven |Reload project命令更新项目

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-beans</artifactId>

    <version>5.2.25.RELEASE</version>

</dependency>

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>5.2.25.RELEASE</version>

</dependency>

       项目更新后,增加了如下了一些Spring依赖包。

在项目中创建包com.my,在包com.my下创建类Hello和Main,定义如下:

package com.my;
import org.springframework.stereotype.Component;

@Component
public class Hello {
    public void print(){
        System.out.println("Hello World!");
    }
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.my")
public class Main {
    public static void main(String[] args){
        AnnotationConfigApplicationContext context=
                new AnnotationConfigApplicationContext(Main.class);
        Hello hello=context.getBean(Hello.class);
        hello.print();
    }
}

运行类Main,在控制台中输出如下信息:

Hello World!

代码说明:

  • 使用注解@Component声明的类是由Spring Ioc容器管理的一个Bean。
  • 使用注解@Configuration声明的类是Spring框架中的一个配置类。
  • 注解@ComponentScan("com.my")表示Spring框架自动扫描com.my包及其子包下所有使用注解@Service@Component@Repository@Controller的声明的类,并将其注册为Bean
  • AnnotationConigApplicationContext是Spring 框架中的一个类,用于基于 Java 注解的配置来启动 Spring 容器。该类是接口ApplicationContext的一个实现类,它允许从一个或多个基于 Java 的配置类中加载Spring应用上下文。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Baidu Comate五分钟 , 工作时间摸鱼8小时

Baidu Comate&#xff1a;引领智能编码新时代 文章目录 Baidu Comate&#xff1a;引领智能编码新时代一、明日工具&#xff0c;今日领先——百度Comate智能编码助手二、万变不离其宗——适配场景需求三、功能研究3.1 指挥如指掌——指令功能3.2 助手增援——插件功能使用3.3 实…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与&#xff08;多&#xff09;Paxos等效的结果&#xff0c;并且与Paxos一样高效&#xff0c;但其结构与Paxos不同。这使得Raft比Paxos更易理解&#xff0c;也为构建实际系统提供…

VS2022 错误 LNK2001 无法解析的外部符号

错误 LNK2001 无法解析的外部符号 “private: static struct std::once_flag ThreadPool::flag_” (?flag_ThreadPool0Uonce_flagstdA) STL D:\VS2019\STL\源.obj 1 错误原因 &#xff1a;链接器无法解析 ThreadPool::flag_ 这个静态成员变量。这通常是因为静态成员变量在声明…

宁夏银川市起名专家的老师颜廷利:死神(死亡)并不可怕,可怕的是...

在中国优秀传统文化之中&#xff0c;汉语‘巳’字与‘四’同音&#xff0c;在阿拉伯数字里面&#xff0c;通常用‘4’来表示&#xff1b; 湖南长沙、四川成都、重庆、宁夏银川最靠谱最厉害的起名大师的老师颜廷利教授指出&#xff0c;作为汉语‘九’字&#xff0c;倘若是换一个…

《中国应急管理》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《中国应急管理》杂志是核心期刊吗&#xff1f; 答&#xff1a;不是核心期刊&#xff0c;是正规学术期刊 问&#xff1a;《中国应急管理》杂志是电子版期刊吗&#xff1f; 答&#xff1a;不是&#xff0c;是纸质期刊 问&#xff1a;《…

IMDB的电影评论数据pytorh使用lstm

使用lstm对IMDB的电影评论数据进行情感分析&#xff08;pytorch代码&#xff09; 接下来让我们看看如何使用pytorch实现一个基于长短时记忆网络的情感分析模型。在飞桨中&#xff0c;不同深度学习模型的训练过程基本一致&#xff0c;流程如下&#xff1a; 数据处理&#xff1…

d17(154-168)-勇敢开始Java,咖啡拯救人生

目录 方法递归 字符集 编码-解码 IO流 字节流 字节输入流 InputSream FileInputStream 字节输出流 OutputSream FileOutputSream 释放资源的方式 try-catch-finallly try-with-resource 字符流 字符输入流 Reader FileReader 文件字符输出流 Writer FileWriter …

大数据分析案例-基于随机森林算法构建银行贷款审批预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C#之partial关键字

在C#中&#xff0c;partial关键字用于声明一个类、结构体、接口或方法的分部定义。这意味着可以将一个类或其他类型的定义分成多个部分&#xff0c;这些部分可以在同一个命名空间或程序集中的多个源文件中进行定义。当编译器编译这些部分时&#xff0c;会将它们合并成一个单独的…

【RAG 论文】BGM:为 LLM 和 Retriever 的偏好 gap 搭建一个 Bridge

论文&#xff1a;Bridging the Preference Gap between Retrievers and LLMs ⭐⭐⭐ Google Research, arXiv:2401.06954 论文速读 LLM 与 Retriever 之间存在一个 preference gap&#xff1a;大多数 retriever 被设计为 human-friendly&#xff0c;但是 LLM 的偏好与人类的却…

网络配置的加密存储

随着数据泄露事件的增加&#xff0c;扰乱了公司的正常工作周期&#xff0c;企业遭受了损失。事实上&#xff0c;数据泄露可以通过存储加密来控制&#xff0c;存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中&#xff0c;存储加密可用于存储设…

C++数据结构——AVL树

目录 一、引言 1.1 二叉搜索树 1.2 二叉搜索树的缺陷 1.3 AVL数的引入 二、AVL树结点的定义 三、AVL树的操作 3.1 插入 3.1.1 基本步骤 3.1.2 平衡因子的调整 3.2 旋转操作(重点&#xff01;) 3.2.1 右单旋 3.2.2 左单旋 3.2.3 左右双旋 3.2.4 右左双旋 3.3 插入…

【算法】滑动窗口——最小覆盖子串

本节博客是对“最小覆盖子串”题目由暴力求解到滑动窗口的思路解析&#xff0c;有需要借鉴即可。 目录 1.题目2.滑动窗口解法3.总结 1.题目 题目链接&#xff1a;LINK 这个题目是困难难度&#xff0c;感觉是一个中等题目的感觉。 首先我肯定想到的是暴力求解的方法&#xff…

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗&#xff1f;如何避免灾难遗忘大模型的幻觉问题微调后的输出…

MySQL表的增删查改【基础部分】

数据表的操作 新增 普通插入 insert into 表名 values(值,值...)注意&#xff1a; 此处的值要和表中的列相匹配 使用’‘单引号或者”“双引号来表示字符串 mysql> insert into student values(123,zhangsan); Query OK, 1 row affected (0.02 sec)指定列插入 insert …

搜索引擎的设计与实现(二)

目录 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.检索器(Searcher) 4.用户接口(UserInterface) 3.2搜索引擎的详细工作流程 4 系统分析与设计 4.1系统分析 4.2系统概要设计 4.2系统实现目标 前面内容请移步 搜索引…

苍穹外卖Day06笔记(复习了jwt的加密解密和传递)

疯玩了一个月&#xff0c;效率好低&#xff0c;今天开始捡起来苍穹外卖~ 1. 为什么不需要单独引入HttpClient的dependency&#xff1f; 因为我们在sky-common的pom.xml中已经引入了aliyun-sdk-oss的依赖&#xff0c;而这个依赖低层就引入了httpclinet的依赖&#xff0c;根据依…

06、SpringBoot 源码分析 - SpringApplication启动流程六

SpringBoot 源码分析 - SpringApplication启动流程六 初始化基本流程SpringApplication的prepareEnvironment准备环境SpringApplication的getOrCreateEnvironment创建环境configureEnvironment配置环境ApplicationConversionService的getSharedInstance配置转换器 SpringApplic…

LLVM中期报告

1&#xff0e;主要开展的工作 研究对LLVM IR层面进行代码混淆&#xff0c;分析IR的指令 &#xff0c;并且实现混淆 从LLVM代码混淆的角度出发&#xff0c;函数之间的正常调用构成了待混淆程序的原始控制流&#xff0c;不同的基础代码块构成了一个个的函数&#xff0c;每个基础…

PyQt6--Python桌面开发(12.QpushButton按钮控件)

一.按钮类控件 二.QpushButton按钮控件 2.1QAbstractButton类属性 2.2QpushButton类属性