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

文章目录

  • 一、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.mzph.cn/news/775844.shtml

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

相关文章

聚观早报 | 比亚迪2023年营收;vivo X Fold3系列发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月28日消息 比亚迪2023年营收 vivo X Fold3系列发布 现代汽车拟投入68万亿韩元 华为P70系列最新渲染图 苹果A1…

C语言牛客网BC-37 牛牛的圆(求面积)

题目如下 代码实现 #include<stdio.h> int main() { float r 0;float s 0;scanf("%f",&r);s 3.14*r*r;printf("%.2f",s);return 0; } 创作不易&#xff0c;点点关注&#xff0c;感谢支持&#xff01;&#xff01;&#xff01;

[BT]BUUCTF刷题第9天(3.27)

第9天&#xff08;共2题&#xff09; [护网杯 2018]easy_tornado 打开网站就是三个txt文件 /flag.txt flag in /fllllllllllllag/welcome.txt render/hints.txt md5(cookie_secretmd5(filename))当点进flag.txt时&#xff0c;url变为 http://b9e52e06-e591-46ad-953e-7e8c5f…

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023

《论文阅读》PAGE&#xff1a;一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023 前言 简介任务定义模型构架Utterances Encoding with EmotionPosition-aware GraphCausal Classifier实验结果 前言 亲身阅读感受分享&#xff0c;细节画图解释&#xff0c;再也不用担…

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板&#xff0c;设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329

Clickhouse中的基本数据类型操作和引擎

一、表操作 数据类型: 注意事项&#xff1a; 1、建表写数据类型的时候&#xff0c;严格区分大小写Int32,不能写成int32 2、建表的时候&#xff0c;必须要指定表引擎 1.整数类型 2. 字符串类型 String&#xff1a;可以任意长度的。它可以包含任意的字节集&#xff0c;包含空字…

Avalonia笔记4-Rider如何添加xaml支持

在Linux Rider中&#xff0c;File Type中是有XAML文件的&#xff0c;但是新增xaml文件并不能正确的添加到项目中&#xff0c;而且就算是新增文件&#xff0c;直接命名为“XXX.xaml”&#xff0c;也是没有智能提示的。 在引用Style文件的时候&#xff0c;需要新建一个axaml的文…

2024,听世界用中文讲故事

汉语为桥&#xff0c;联结一段中国缘分&#xff1b;故事为骨&#xff0c;分享一段精彩人生&#xff1b;文化为翼&#xff0c;共筑一个和美地球村。近日&#xff0c;由教育部中外语言交流合作中心主办、中文联盟承办的第二届“汉语桥”全球外国人汉语大会故事会启动。与世界深情…

网站可扩展架构设计

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、可扩展性架构简介 1.可扩展性是什么 可扩展性指系统为了应对将来需求变化而提供的一种扩展能力&#xff0c;当有新的需求出现时&#xff0c;系…

【数据结构】链表习题之反转链表和删除链表中等于给定值 val 的所有节点

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 今天的博客是关于链表的题目&#xff0c;力扣上的题目之反转链表和删除链表中等于给定值 val 的所有节点 一.反转…

基于SpringBoot的“篮球竞赛预约平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“篮球竞赛预约平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 平台首页界面图 用户注册界面…

使用Qt生成图片

Qt之生成png/jpg/bmp格式图片_qt生成图片-CSDN博客 (1)使用QPainter 示例关键代码&#xff1a; QImage image(QSize(this->width(),this->height()),QImage::Format_ARGB32);image.fill("white");QPainter *painter new QPainter(&image);painter->…

QT程序打包

将exe文件单独拿出来放入一个单独的文件夹 保存qt安装路径下有如下这个文件 windeployqt.exe 在TCPFile.exe文件夹中使用以下cmd命令运行 即可打包 windeployqt 文件名.exe 成功打包&#xff01;

功能强大的国外商业PHP在线教育系统LMS源码/直播课程系统

功能强大的国外商业PHP在线教育系统LMS/在线教育市场源码/直播课程系统 Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个…

第十篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作Excel

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列博文目录 前言一、重要作用解说二、Python操作Excel的常用库介绍三、数据处理和分析示例代码四、自动化报表生成示例代码五、数据导入和导出示例代码六、数据可视化示例代码八、数据校验和清洗示例代码九、…

go面向对象

继承 封装 多态 定义结构体 //定义老师的结构体 type Teacher struct {Name stringAge intSchool string }func main() {var t1 Teacherfmt.Println(t1)t1.Name "tom"t1.Age 20t1.School "school"fmt.Println(t1) } 结构体实例的创建 package ma…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

springboot使用com.github.binarywang 包实现微信网页上的支付和退款

前提 微信小程序中实现微信支付是从小程序中调去微信支付的界面直接进行支付&#xff0c;那么在pc端需要实现微信的支付呢&#xff0c;是需要出现一个二维码让用户使用扫码支付的。 注意&#xff1a; 需要实现pc端的微信支付&#xff0c;需要在微信商户平台开通native支付&…

如何使用VS统计自己的代码量?

历经漫漫编程之路&#xff0c;此刻我们不妨回首细数&#xff0c;那已累积的无数行代码&#xff0c;它们如同一串串无声的脚印&#xff0c;记载着我们默默耕耘的点滴时光。每一行代码都是平凡努力的印记&#xff0c;见证了我们的执着与付出&#xff0c;也塑造了今天的我们。让这…

uniApp使用XR-Frame创建3D场景(3)光源投影的运用。

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解光源在场景中的运用以及相关属性。 在子组件 xr-start的index.wxml文件中我们加入如下代码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr…