Spring实战:采用Spring配置文件管理Bean

news/2024/4/29 22:40:37

文章目录

  • 一、Spring框架概述
  • 二、实战:采用Spring配置文件管理Bean
    • (一)创建Jakarta EE项目
    • (二)添加Spring依赖
    • (三)创建杀龙任务类
    • (四)创建勇敢骑士类
    • (五)采用传统方式让勇敢骑士完成杀龙任务
    • (六)采用Spring容器让勇敢骑士完成杀龙任务
      • 1、创建日志属性文件
      • 2、创建Spring配置文件
      • 3、在Spring配置文件里创建Bean
        • (1)创建杀龙任务Bean
        • (2)创建勇敢骑士Bean
      • 4、创建新勇敢骑士测试类
      • 5、创建两个勇敢骑士Bean
      • 6、修改新勇敢骑士测试类
    • (七)采用构造方法注入方式注入属性值
      • 1、创建救美任务类
      • 2、创建救美骑士类
      • 3、创建旧救美骑士测试类
      • 4、配置救美骑士Bean
      • 5、创建新救美骑士测试类
  • 三、实战总结
  • 四、思考题

一、Spring框架概述

在这里插入图片描述

  • 在即将进行的Spring框架实战中,我们将深入探索如何使用Spring的依赖注入和控制反转原则来管理Java对象。通过创建任务类和执行者类,并利用Spring配置文件来定义Bean,我们将学习如何将对象管理和依赖解析委托给Spring容器。这将帮助我们编写出更加灵活、可维护且易于测试的代码。让我们开始这段Spring框架的学习之旅吧!

二、实战:采用Spring配置文件管理Bean

  • Spring容器其实就是一个Bean工厂,在工厂里通过配置文件或配置类创建各种各样的Bean,然后在Spring应用程序就可以按照名称或类型获取工厂里已经配置好的Bean。下面我们就通过一个具体的案例来了解Spring容器是如何工作的。创建Spring应用程序 - 骑士完成任务。

(一)创建Jakarta EE项目

  • 创建Jakarta EE项目,设置名称 - SpringDemo,位置、模板、语言、构建系统、组标识、构建标识和JDK版本
    在这里插入图片描述

  • 单击【Next】按钮,在对话框里选择Jakarta EE 10版本,不添加依赖
    在这里插入图片描述

  • 单击创建【Create】按钮,得到一个空Maven项目
    在这里插入图片描述

  • 修改项目的Maven配置
    在这里插入图片描述

(二)添加Spring依赖

  • Spring 6.1.5要求使用JDK 17作为最低版本。首先,Spring框架的每个主要版本通常会对Java Development Kit (JDK)的版本有一定的要求,这是为了确保框架能够充分利用Java语言提供的最新特性和性能改进。对于Spring 6.1.5来说,其要求的JDK最低版本是JDK 17,这一改变可能是由于Spring 6在内部架构上进行了重构,以适应Graal的AOT(Ahead-of-Time compilation)要求,同时也为了更好地支持新的功能和提高性能。其次,JDK 17引入了许多新的特性,包括模式匹配、记录类、sealed类、switch表达式等,这些都是在Java语言层面上的重要改进。需要注意的是,随着JDK版本的提升,企业需要评估现有系统是否支持升级,因为这可能涉及到其他依赖库的兼容性问题以及系统的整体迁移成本。同时,开发者也应当及时更新自己的技术栈,以便能够更好地利用新版本带来的优势。

  • 本博开发环境:JDK21,IntelliJ IDEA 2022.3,准备使用Spring6.1.5版本

  • 在Maven仓库里查找Spring框架(https://mvnrepository.com)
    在这里插入图片描述

  • 查看Spring Core
    在这里插入图片描述

  • 选择最新版本 - 6.1.5
    在这里插入图片描述

  • 添加到pom.xml文件的<dependencies>元素里
    在这里插入图片描述

  • 同理添加其他依赖
    在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.huawei.spring</groupId><artifactId>SpringDemo</artifactId><version>1.0-SNAPSHOT</version><name>SpringDemo</name><dependencies><!--Spring核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.1.5</version></dependency><!--Spring实体--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.1.5</version></dependency><!--Spring容器--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.5</version></dependency><!--Spring Web--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.1.5</version></dependency><!--Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.1.5</version></dependency><!--Spring测试--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.1.5</version></dependency><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies></project>
  • 打开Maven窗口,单击刷新按钮,就开始下载依赖包,等待插件与依赖下载完成
    在这里插入图片描述

  • 可以查看本地Maven仓库里当前项目下载的有关Spring框架的依赖
    在这里插入图片描述

(三)创建杀龙任务类

  • 创建net.huawei.spring.day01包,然后在包里面创建SlayDragonQuest
    在这里插入图片描述
package net.huawei.spring.day01;/*** 功能:杀龙任务类* 作者:华卫* 日期:2024年03月27日*/
public class SlayDragonQuest {public void embark() {System.out.println("执行杀龙任务……");}
}

(四)创建勇敢骑士类

  • net.huawei.spring.day01包里创建BraveKnight
    在这里插入图片描述
package net.huawei.spring.day01;/*** 功能:勇敢骑士类* 作者:华卫* 日期:2024年03月27日*/
public class BraveKnight {private String name; // 骑士姓名private SlayDragonQuest slayDragonQuest; // 杀龙任务public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 设置杀龙任务** @param slayDragonQuest*/public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest) {this.slayDragonQuest = slayDragonQuest;}/*** 勇敢骑士执行任务*/public void embarkOnQuest() {System.out.print("勇敢骑士[" + name + "]"); // 骑士留名slayDragonQuest.embark(); // 执行杀龙任务}
}
  • 回顾一下传统方式怎么使用这两个类。需要我们自己通过new实例化两个类,然后设置勇敢骑士对象的姓名和杀龙任务属性,然后调用勇敢骑士执行任务的方法。

(五)采用传统方式让勇敢骑士完成杀龙任务

  • test/java里创建net.huawei.spring.day01包,然后在包里面创建TestBraveKnightOld
    在这里插入图片描述
package net.huawei.spring.day01;import org.junit.Test;/*** 功能:采用传统方式测试勇敢骑士类* 作者:华卫* 日期:2024年03月27日*/
public class TestBraveKnightOld {@Testpublic void testBraveKnight() {// 创建杀龙任务对象SlayDragonQuest slayDragonQuest = new SlayDragonQuest();// 创建勇敢骑士对象BraveKnight braveKnight = new BraveKnight();// 设置勇敢骑士属性braveKnight.setName("罗宾汉");braveKnight.setSlayDragonQuest(slayDragonQuest);// 调用勇敢骑士执行任务方法braveKnight.embarkOnQuest();}
}
  • 运行测试方法testBraveKnight(),查看程序运行结果
    在这里插入图片描述

(六)采用Spring容器让勇敢骑士完成杀龙任务

1、创建日志属性文件

  • resources目录里创建log4j.properties
    在这里插入图片描述
log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2、创建Spring配置文件

  • resources里创建xmlconfig目录,然后在里面创建spring-config.xml
    在这里插入图片描述

  • 输入Spring配置文件名
    在这里插入图片描述

  • Spring容器是管理Bean的工厂,在<beans>……</beans>根元素里可以配置Bean
    在这里插入图片描述

    • 单击【Configure application context】(配置应用上下文)
      在这里插入图片描述
  • 单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的
    在这里插入图片描述

  • 单击【OK】按钮,黄色警告条消失
    在这里插入图片描述

  • 在项目结构窗口里查看配置好的pring-config.xml
    在这里插入图片描述

  • 现在我们有了生产Bean的车间,下面我们就要在车间里配置产品

3、在Spring配置文件里创建Bean

(1)创建杀龙任务Bean
<!--配置杀龙任务Bean-->
<bean id="slayDragonQuest" class="net.huawei.spring.day01.SlayDragonQuest"/>
  • id属性 :对应对象名,可以任取,然后在应用程序里我们可以通过这个id值从Spring容器中获取Bean对象。
  • class属性 :表明Bean对象是基于哪个类来实例化,注意一定要包含包名。
(2)创建勇敢骑士Bean
<!--配置勇敢骑士Bean-->                                                 
<bean id="braveKnight" class="net.huawei.spring.day01.BraveKnight"> <property name="name" value="罗宾汉"/>  <!-- RobinHood.setName("罗宾汉")-->                        <property name="slayDragonQuest" ref="slayDragonQuest"/>  <!--RobinHood.setSlayDragonQuest(slayDragonQuest)-->  
</bean>                                                                                                                       
  • property元素:给对象设置属性值
  • name属性:Bean对象的属性名
  • ref属性:Bean对象的属性值(引用另一个Bean对象)
  • 勇敢骑士Bean通过<property>元素将杀龙任务Bean注入作为其属性。注意,name属性值一定是BraveKnight类的属性名,ref属性值是已定义的杀龙任务Bean的id值。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置杀龙任务Bean--><bean id="slayDragonQuest" class="net.huawei.spring.day01.SlayDragonQuest"/><!--配置勇敢骑士Bean--><bean id="braveKnight" class="net.huawei.spring.day01.BraveKnight"><property name="name" value="罗宾汉"/> <!--braveKnight.setName("罗宾汉");--><property name="slayDragonQuest" ref="slayDragonQuest"/> <!--braveKnight.setSlayDragonQuest(slayDragonQuest);--></bean>
</beans>
  • 通过Spring配置文件,创建了两个Bean对象,它们之间存在依赖关系,第一个Bean对象是第二个Bean对象的任务属性值。
    在这里插入图片描述

4、创建新勇敢骑士测试类

  • test/java/net.huawei.spring.day01里创建TestBraveKnightNew测试类
    在这里插入图片描述
  • 采用基于类路径的应用容器类 - ClassPathXmlApplicationContext
    在这里插入图片描述
    在这里插入图片描述
package net.huawei.spring.day01;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 功能:采用Spring容器测试勇敢骑士类* 作者:华卫* 日期:2024年03月27日*/
public class TestBraveKnightNew {private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器(Bean工厂)@Before // 每次测试方法执行前都要执行的代码就放在此方法里public void init() {// 基于Spring配置文件创建应用容器context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");// 提示用户System.out.println("Spring应用容器已创建~");}@Testpublic void testBraveKnight() {// 根据名称从应用容器中获取勇敢骑士对象BraveKnight braveKnight = (BraveKnight) context.getBean("braveKnight");// 勇敢骑士执行任务braveKnight.embarkOnQuest();}@After // 每次测试方法执行后都要执行的代码就放在此方法里public void destroy() {// 关闭应用容器context.close();// 提示用户System.out.println("Spring应用容器已关闭~");}
}
  • 代码说明:首先通过Spring配置文件创建Spring应用容器,然后就可以利用容器的getBean方法通过名称获取容器里的Bean对象,然后调用该对象的方法。

  • 运行测试方法testBraveKnight(),查看结果
    在这里插入图片描述

  • 如果获取没有在Spring配置文件里配置的Bean,那么就会报错……
    在这里插入图片描述

5、创建两个勇敢骑士Bean

  • 基于一个类可以创建多个对象,因此,在spring-config.xml文件里,也可以基于同一个类创建多个Bean。

  • 基于BraveKnight类再创建两个Beanid值分别为knight1knight2
    在这里插入图片描述

  • 在Spring配置文件里,同一个Bean不能重复定义,也就是说不允许两个Bean有相同的id

6、修改新勇敢骑士测试类

  • 获取新建的两个勇敢骑士Bean,调用执行任务方法
    在这里插入图片描述

  • 执行testBraveKnight()测试方法,查看结果
    在这里插入图片描述

  • 勇敢骑士Bean采用属性注入方式将杀龙任务Bean注入作为其属性。
    在这里插入图片描述

  • 初始化对象其实可以调用有参构造方法来设置属性的初始值,对应到Spring的Bean工厂,就还有一种注入方式,叫做构造方法注入。同样地,我们还是通过案例来演示如何通过构造方法来注入属性值。

(七)采用构造方法注入方式注入属性值

1、创建救美任务类

  • net.huawei.spring.day01包里创建RescueDamselQuest
    在这里插入图片描述
  • Rescue Damsel - 拯救少女
package net.huawei.spring.day01;/*** 功能:救美任务类* 作者:华卫* 日期:2024年03月27日*/
public class RescueDamselQuest {public void embark() {System.out.println("执行救美任务……");}
}

2、创建救美骑士类

  • net.huawei.spring.day01包里创建RescueDamselKnight
    在这里插入图片描述
package net.huawei.spring.day01;/*** 功能:救美骑士类* 作者:华卫* 日期:2024年03月27日*/
public class RescueDamselKnight {private String name; // 骑士姓名private RescueDamselQuest rescueDamselQuest; // 救美任务/*** 有参构造方法** @param name* @param rescueDamselQuest*/public RescueDamselKnight(String name, RescueDamselQuest rescueDamselQuest) {this.name = name;this.rescueDamselQuest = rescueDamselQuest;}public void embarkOnQuest() {System.out.print("救美骑士[" + name + "]");rescueDamselQuest.embark();}
}
  • 代码说明:通过构造方法来设置骑士的姓名与要执行的任务。

3、创建旧救美骑士测试类

  • test/java/net.huawei.spring.day01包里创建TestRescueDamselKnightOld
    在这里插入图片描述
package net.huawei.spring.day01;import org.junit.Test;/*** 功能:采用传统方式测试救美骑士类* 作者:华卫* 日期:2024年03月27日*/
public class TestRescueDamselKnightOld {@Testpublic void testRescueDamselKnight() {// 创建救美任务对象RescueDamselQuest rescueDamselQuest = new RescueDamselQuest();// 创建救美骑士对象RescueDamselKnight rescueDamselKnight = new RescueDamselKnight("格拉海德", rescueDamselQuest);// 救美骑士执行任务rescueDamselKnight.embarkOnQuest();}
}
  • 运行testRescueDamselKnight()测试方法,查看结果
    在这里插入图片描述

4、配置救美骑士Bean

  • 在Spring配置文件里配置救美骑士Bean
    在这里插入图片描述

  • arg: argument 参数

<!--配置救美任务Bean-->                                                                    
<bean id="rescueDamselQuest" class="net.huawei.spring.day01.RescueDamselQuest"/>     <!--配置救美骑士Bean-->                                                                    
<bean id="rescueDamselKnight" class="net.huawei.spring.day01.RescueDamselKnight">  <constructor-arg value="格拉海德"/>                                                  <constructor-arg ref="rescueDamselQuest"/>                                       
</bean>                                                                                                                                                                                                    

5、创建新救美骑士测试类

  • test/java/net.huawei.spring.day01包里创建TestRescueDamselKnightNew
    在这里插入图片描述
package net.huawei.spring.day01;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 功能:采用Spring容器测试救美骑士类* 作者:华卫* 日期:2024年03月27日*/
public class TestRescueDamselKnightNew {private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器(Bean工厂)@Before // 每次测试方法执行前都要执行的代码就放在此方法里public void init() {// 基于Spring配置文件创建应用容器context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");// 提示用户System.out.println("Spring应用容器已创建~");}@Testpublic void testRescueDamselKnight() {// 根据名称从应用容器中获取救美骑士对象RescueDamselKnight rescueDamselKnight = (RescueDamselKnight) context.getBean("rescueDamselKnight");// 救美骑士执行任务rescueDamselKnight.embarkOnQuest();}@After // 每次测试方法执行后都要执行的代码就放在此方法里public void destroy() {// 关闭应用容器context.close();// 提示用户System.out.println("Spring应用容器已关闭~");}
}
  • 运行testRescueDamselKnight()测试方法,查看效果
    在这里插入图片描述

三、实战总结

  • 通过使用Spring框架,我们可以更好地管理Bean的生命周期和依赖关系,实现对象之间的解耦合,从而提高了代码的可维护性和可测试性。在本次实战中,我们首先创建了一个Jakarta EE项目,并添加了Spring依赖。接着,我们创建了杀龙任务类和勇敢骑士类,并采用传统方式让勇敢骑士完成杀龙任务。然后,我们使用Spring容器来管理Bean,并通过配置文件创建了杀龙任务Bean和勇敢骑士Bean。在测试类中,我们成功地使用了Spring容器来实例化勇敢骑士并完成杀龙任务。此外,我们还尝试了使用构造方法注入方式注入属性值的方法,进一步了解了Spring框架的强大功能。通过这次实战,我们对Spring框架的使用有了更深入的了解和实践经验。

四、思考题

  • 如果我们有几十个类要创建Bean,采用XML配置方式,会不会让Spring配置文件显得很臃肿,怎么解决这个问题呢?

http://www.mrgr.cn/p/72364781

相关文章

GAMES01 Geometry

生活中有许多曲面、曲线需要去表示。这里也有许多表示几何的方法: Implicitalgebraic surface level sets distance functions ...Explicitpoint cloud polygon mesh subdivision, NURBS ...Implicit表达 通常,隐式表达被定义为f(x,y,z)=0,其中f(x,y,z)是一个xyz的关系表达式…

【开发篇】十、Arthas和BTrace在线定位问题

文章目录 0、补充1、jmap Arthas2、BTrace3、总结 前面排查内存溢出&#xff0c;是通过生成的内存快照&#xff0c;当内存较大时&#xff0c;此方法生成、导出快照慢&#xff08;主要生成堆内存快照的时候&#xff0c;会耽误服务器去处理用户发来的请求&#xff0c;影响体验&a…

SQLite中的动态内存分配(五)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite中的原子提交&#xff08;四&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; ​概述 SQLite使用动态内存分配来获得 用于存储各种对象的内存 &#xff08;例如&#xff1a…

openGauss Session性能诊断

Session性能诊断 可获得性 本特性自openGauss 1.0.0 版本开始引入。 特性简介 Session性能诊断提供给用户Session级别的性能问题诊断。 客户价值查看最近用户Session最耗资源的事件。 查看最近比较占资源的SQL把资源都消耗在哪些等待事件上。 查看最近比较耗资源的Session把资源…

以太网与数据链路层

以太网是数据链路层中最常用的协议之一&#xff0c;用于在局域网&#xff08;LAN&#xff09;中传输数据。以下是关于以太网协议的一些重要信息&#xff1a; 1. 物理层和数据链路层&#xff1a; 以太网协议涵盖了 OSI 模型中的物理层和数据链路层。物理层负责在网络媒介&…

通俗认识计算机

认识计算机 1 通俗理解计算机是什么计算机就是一个机器,它接收一些数据之后,就开始算算算,然后把计算结果输出出来,这就是计算机。 上面说的那个算算算的东西,有很多种,有的这样算,有的那样算。为了满足不同的算算算,得有个东西去算它,这个东西就叫做程序。不同的程序…

2-17. 物品数据库填写规则

首先把原来界面上没有绑定的字段都给完成private void GetItemDetails(){itemDetailSection.MarkDirtyRepaint();itemDetailSection.Q<IntegerField>("itemID").value = activeItem.itemID;itemDetailSection.Q<IntegerField>("itemID").Regis…

修复ubuntu引导

一、制作ubuntu启动U盘 进入启动盘后&#xff0c;点击Try ubuntu&#xff0c;进入U盘的ubuntu系统。 二、配置和添加源 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update三、运行 Boot Repair重新制作引导 sudo boot-repair注意&#x…

ArcGIS Enterprise 环境重装

2. 情况说明 在服务器上已经配好了 ArcGIS Enterprise,环境如下:ArcGIS Server 配置了 DataStore,适配了 WebAdaptor,并与 Portal 联合。 Portal 适配了 WebAdatpor,并联合了 ArcGISServer 现在要重装服务器的 ArcGIS Enterprise 内容,想继续使用之前的配置和存储内容,需…

Django框架之web框架优化

一、web应用框架简介及手撸web框架 软件开发架构详细:网络编程之网络架构及其趋势 - Xiao0101 - 博客园 (cnblogs.com) 软件开发架构分为两种:c/s架构:客户端软件(client)—服务端软件(server) b/s架构 :浏览器(Browser)------服务端软件(server)总结:BS本质上也是CS架构 …

AXI总线介绍(详解)

原文地址:https://zhuanlan.zhihu.com/p/610401819 一、什么是总线 总线就是一组统一的信号和协议,通常用于设备之间的通讯和传输主设备master:主动发出请求(如 CPU) 从设备slave :被动相应请求(如 内存)二、最简单的总线(同步读 SRAM – 读写数据延迟固定 1 周期 ) …

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白&#xff0c;内容未加载。 填坑&#xff1a; 打包配置要用相对路径 vite.config.ts文件中的base要改成./&#xff0c;之前加了项目…

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;MAVEN方式加 载&#xff0c;系统具有完整的源代码和…

【计算机网络】应用层——万维网和HTTP协议

万维网 万维网www (World Wide Web)是一个大规模的、联机式的信息储藏所/资料空间,是无数个网络站点和网页的集合。资源(文字、视频、音频...) 统一资源定位符URL,唯一标识资源!用户通过点击超链接(http://www.baidu.com)获取资源,这些资源通过超文本传输协议(HTTP)传送给使…

【计算机网络】应用层——文件传输协议FTP

文件传输协议FTPTFTP是比较简单,比较小的。 文件传送协议FTP (File Transfer Protocol) 提供不同种类主机系统(硬、软件体系等都可以不同)之间的文件传输能力。 是一种拷贝,主要提供上传和下载。 FTP服务器和用户端 FTP是基于客户/服务器(C/S)的协议。 用户通过一个客户机程序…

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇&#xff1a;概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…

el-table 固定列错位线.el-table__fixed

/* 固定列错位线 */ .el-table__fixed::before{background-color: transparent !important; }

强化基础-Java-泛型

什么是泛型&#xff1f; 泛型其实就参数化类型&#xff0c;也就是说这个类型类似一个变量是可变的。 为什么会有泛型&#xff1f; 在没有泛型之前&#xff0c;java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷&#xff1a; 1 获取值的时候必须进行强转 2 没有…

探索华为云CCE敏捷版金融级高可用方案实践案例

作为容器混合云在线下的延伸,CCE 敏捷版提供了高性能可扩展的容器服务,快速构建高可靠的容器集群,兼容 Kubernetes 及 Docker 容器生态。本文分享自华为云社区《华为云CCE敏捷版金融级高可用方案实践》,作者: 云容器大未来。 一、背景 1.1. CCE 敏捷版介绍 云原生技术有利…