企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean
文章目录
- 一、Spring容器演示——采用Spring配置文件管理Bean
- (一)创建Maven项目
- (二)添加Spring依赖
- (三)创建杀龙任务类
- (四)创建勇敢骑士类
- (五)采用传统方式让勇敢骑士完成杀龙任务
- (六)采用Spring容器让勇敢骑士完成杀龙任务
- 1、创建日志属性文件
- 2、创建Spring配置文件
- 3、在Spring配置文件里创建Bean
- (1)创建杀龙任务Bean
- (2)创建勇敢骑士Bean
- 4、创建新勇敢骑士测试类
- 5、创建两个勇敢骑士Bean
- 6、修改新勇敢骑士测试类
一、Spring容器演示——采用Spring配置文件管理Bean
- Spring容器其实就是一个Bean工厂,在工厂里通过配置文件或配置类创建各种各样的Bean,然后在Spring应用程序就可以按照名称或类型获取工厂里已经配置好的Bean。下面我们就通过一个具体的案例来了解Spring容器是如何工作的。创建Spring应用程序 - 骑士完成任务。
(一)创建Maven项目
-
创建Maven项目 -
SpringDemo,设置项目位置以及组ID

-
单击【Finish】按钮,pom(project object model)对项目的版本、依赖与插件进行管理

-
修改项目的
Maven配置

(二)添加Spring依赖
- Spring框架与JDK版本对应关系
| Spring框架版本 | JDK版本 |
|---|---|
| 6.0.x | JDK 17-21(预期) |
| 5.3.x | JDK 8-19(预期) |
| 5.2.x | JDK8-15 |
| 5.1.x | JDK8-12 |
| 5.0.x | JDK8-10 |
| 4.3.x | JDK6-8 |
本博开发环境:JDK11,IntelliJ IDEA 2020(最多支持JDK14),因此只好使用Spring5.3.x版本
如果IntelliJ IDEA 2021就可以支持JDK17,因此就可以使用Spring6.0.x版本
- 在Maven仓库里查找Spring框架(https://mvnrepository.com)

- 查看
Spring Core

-
选择最新版本 -
5.3.25

-
添加到
pom.xml文件的<dependencies>元素里(如果没有下载到本地,5.3.25将会显示红色)

-
同理添加其他依赖
<?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.0http://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><dependencies><!--Spring核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.25</version></dependency><!--Spring实体--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.3.25</version></dependency><!--Spring容器--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.25</version></dependency><!--Spring Web--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.25</version></dependency><!--Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.25</version></dependency><!--Spring测试--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.25</version></dependency><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>
- 打开Maven窗口,单击刷新按钮,就开始下载依赖包,等待插件与依赖下载完成

- 可以查看本地Maven仓库里当前项目下载的有关Spring框架的依赖

(三)创建杀龙任务类
- 创建
net.[name].spring.day01包,然后在包里面创建SlayDragonQuest类

package net.huawei.spring.day01;/*** 功能:杀龙任务类*/
public class SlayDragonQuest {public void embark() {System.out.println("执行杀龙任务……");}
}
(四)创建勇敢骑士类
- 在
net.huawei.spring.day01包里创建BraveKnight类

package net.huawei.spring.day01;/*** 功能:勇敢骑士类*/
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;/*** 功能:采用传统方式测试勇敢骑士类*/
public class TestBraveKnightOld {@Testpublic void testBraveKnight() {// 创建杀龙任务对象SlayDragonQuest slayDragonQuest = new SlayDragonQuest();// 创建勇敢骑士对象BraveKnight braveKnight = new BraveKnight();// 设置勇敢骑士属性braveKnight.setName("罗宾汉");braveKnight.setSlayDragonQuest(slayDragonQuest);// 调用勇敢骑士执行任务方法braveKnight.embarkOnQuest();}
}
-
运行测试方法
testBraveKnight() -
查看程序运行结果

-
出现这个问题要设置Java版本



-
三个地方的设置要保持一致,然后再运行程序,查看结果

(六)采用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配置文件名



- 单击【Configure application context】(配置应用上下文)

- 单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的

- 单击【OK】按钮

- 在项目结构窗口里查看配置好的spring-config.xml

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容器测试勇敢骑士类* 作者:华卫* 日期:2023年02月14日*/
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(),查看结果
-
再次运行程序,查看结果

- 根据名称从应用容器中获取勇敢骑士对象可能会报错,因为配置文件里没有定义那个名称的Bean

5、创建两个勇敢骑士Bean
-
基于一个类可以创建多个对象,因此,在
spring-config.xml文件里,也可以基于同一个类创建多个Bean。 -
基于
BraveKnight类再创建两个Bean,id值分别为knight1和knight2。

- 在Spring配置文件里,同一个Bean不能重复定义,也就是说不允许两个Bean有相同的id值
6、修改新勇敢骑士测试类
-
获取新建的两个勇敢骑士Bean,调用执行任务方法

-
执行
testBraveKnight()测试方法,查看结果

-
勇敢骑士Bean采用
属性注入方式将杀龙任务Bean注入作为其属性。

-
初始化对象其实可以调用有参构造方法来设置属性的初始值,对应到Spring的Bean工厂,就还有一种注入方式,叫做
构造方法注入。同样地,我们还是通过案例来演示如何通过构造方法来注入属性值。
相关文章:
企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean
文章目录一、Spring容器演示——采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇…...
CSS盒子模型
盒子模型 CSS三大特性 继承性、层叠性、优先级 优先级比较 继承 < 通配符选择器 < 标签选择器 < 类选择器 < id选择器 < 行内样式 < !important 注意:!important不能提升继承的优先级,只要是继承优先级最低 复合选择器权重叠加计…...
Python基础学习笔记 —— 数据结构与算法
数据结构与算法1 数据结构基础1.1 数组1.2 链表1.3 队列1.4 栈1.5 二叉树2 排序算法2.1 冒泡排序2.2 快速排序2.3 (简单)选择排序2.4 堆排序2.5 (直接)插入排序3 查找3.1 二分查找1 数据结构基础 本章所需相关基础知识:…...
笔记本连接wifi,浏览器访问页面,显示访问被拒绝
打开chrome、edge浏览器访问第1个第2个页面正常,后面再打开页面显示异常。 但手机连接正常,笔记本连接异常,起初完全没有怀疑是wifi问题 以为用了vpn软件问题,认为中了病毒。杀毒,并没有中毒。 1、关闭vpn代理&#…...
36个物联网专业毕业论文选题推荐
物联网技术在智能家居系统中的应用研究物联网在智慧城市建设中的作用物联网在工业4.0中的实现与发展 物联网与智能物流系统的结合物联网与医疗健康领域的融合研究物联网与环境监测系统的集成物联网与农业生产的结合研究物联网技术对汽车行业的影响与发展物联网在智能安防领域的…...
Pytorch复习笔记--torch.nn.functional.interpolate()和cv2.resize()的使用与比较
1--前言 博主在处理图片尺度问题时,习惯使用 cv2.resize() 函数;但当图片数据需用显卡加速运算时,数据需要在 GPU 和 CPU 之间不断迁移,导致程序运行效率降低; Pytorch 提供了一个类似于 cv2.resize() 的采样函数&…...
ASP.NET Core MVC 项目 AOP之ActionFilterAttribute
目录 一:说明 二:实现ActionFilterAttribute父类 一:说明 ActionFilterAttribute比前两者简单方便,易于扩展,不易产生代码冗余。 ActionFilterAttribute过滤器执行顺序: 1:执行控制器中的构造函数,实例化控制器 2:执行ActionFilterAttribute.OnActionExecutionA…...
浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义
一、行业需求 城市的发展创造了大量工作机会,人口的聚集也推动了居民住宅建设率的增长。人民生活旨在安居乐业,能否住得“踏实”是很多劳动工作者最关心的问题。但目前随着住宅小区规模的不断扩大、人口逐渐密集,在保证居住环境舒适整洁的同…...
Python的深、浅拷贝到底是怎么回事?一篇解决问题
嗨害大家好鸭!我是小熊猫~ 一、赋值 Python中, 对象的赋值都是进行对象引用(内存地址)传递, 赋值(), 就是创建了对象的一个新的引用, 修改其中任意一个变量都会影响到另一个 will …...
TCP协议十大特性
日升时奋斗,日落时自省 目录 1、确认应答 1.1、序号编辑 2、超时重传 3、连接管理 3.1、三次握手 3.2、四次挥手 4、滑动窗口 5、流量控制 6、拥塞控制 7、延时应答 8、捎带应答 9、面向字节流 10、异常情况 TCP协议: 特点:有…...
2.14作业【GPIIO控制LED】
设备树 myleds{ myled1 <&gpioe 10 0>; myled2 <&gpiof 10 0>; myled3 <&gpioe 8 0>; }; 驱动代码 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h&…...
5min搞定linux环境Jenkins的安装
5min搞定linux环境Jenkins的安装 安装Jenkinsstep1: 使用wget 命令下载Jenkinsstep2、创建Jenkins日志目录并运行jekinsstep3、访问jenkins并解锁jenkins,安装插件以及创建管理员用户step4、到此,就完成了Finish、以上步骤中遇到的问题1、 jenkins启动不了2、jenkins无法访问…...
Cortex-M0存储器系统
目录1.概述2.存储器映射3.程序存储器、Boot Loader和存储器重映射4.数据存储器5.支持小端和大端数据类型数据对齐访问非法地址多寄存器加载和存储指令的使用6.存储器属性1.概述 Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间&…...
软件测试——测试用例之场景法
一、场景法的应用场合 场景法主要用于测试软件的业务流程和业务逻辑。场景法是基于软件业务的测试方法。在场景法中测试人员把自己当成最终用户,尽可能真实的模拟用户在使用此软件的操作情景: 重点模拟两类操作: 1)模拟用户正确…...
英文写作中的常用的衔接词
1. 增补 (Addition) in addition, furthermore, again, also, besides, moreover, whats more, similarly, next, finally 2.比较(Comparision) in the same way, similarly, equally, in comparison, just as 3. 对照 (Contrast) in contrast, on …...
新库上线 | CnOpenData中国地方政府债券信息数据
中国地方政府债券信息数据 一、数据简介 地方政府债券 指某一国家中有财政收入的地方政府地方公共机构发行的债券。地方政府债券一般用于交通、通讯、住宅、教育、医院和污水处理系统等地方性公共设施的建设。地方政府债券一般也是以当地政府的税收能力作为还本付息的担保。地…...
Python 条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。 Python 编…...
C语言思维导图大总结 可用于期末考试 C语言期末考试题库
目录 一.C语言思维导图 二.C语言期末考试题库 一.C语言思维导图 导出的图可能有点糊,或者查看链接:https://share.weiyun.com/uhf1y2mp 其实原图是彩色的不知道为什么导出时颜色就没了 部分原图: 也可私信我要全图哦。 图里的链接可能点不…...
从零实现深度学习框架——再探多层双向RNN的实现
来源:投稿 作者:175 编辑:学姐 往期内容: 从零实现深度学习框架1:RNN从理论到实战(理论篇) 从零实现深度学习框架2:RNN从理论到实战(实战篇) 从零实现深度…...
Flink 连接流详解
连接流 1 Union 最简单的合流操作,就是直接将多条流合在一起,叫作流的“联合”(union)。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。这种合流方式非常简…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
