Spring项目的创建与使用

news2024/11/18 4:51:52

一、创建Spring项目

这里使用Maven方式创建Spring项目,分为以下三步:

  1. 创建一个普通的Maven项目
  2. 添加spring框架支持
  3. 添加启动类

注:这里创建的是一个spring的core项目,不是web项目,只需要main方法,不需要tomcat。

1.创建一个Maven项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNnJPUh3-1683279643210)(F:\typora插图\image-20230505150912623.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YwVDob33-1683279643211)(F:\typora插图\image-20230505151529162.png)]

当java文件夹和pom.xml文件都是蓝色的,说明Maven初始化好了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8N6vhZI-1683279643212)(F:\typora插图\image-20230505151749108.png)]

如果这两个文件是灰色的,说明还在加载,可以手动重新加载。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVygeUiz-1683279643213)(F:\typora插图\image-20230505151923041.png)]

2.添加Spring依赖

正常情况下,在项目中的pom.xml中添加Spring依赖即可。添加的依赖有两个,分别是spring-context即spring上下文和spinrg-beans即管理对象的模块。

外部库那里还可以看到添加这两个依赖之后自动产生了其他的,这是因为spring-context实现依赖于其他几个。

配置代码片段是固定的,可以在代码仓库上专门建一个仓库村这样的代码片段。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
</dependencies>

所以,目前pom.xml文件应该长这个样子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sep2ouk-1683279643213)(F:\typora插图\image-20230505162851216.png)]

由于maven仓库在国外,所以我们在添加框架支持的过程中 很可能遇到一直刷新或者下载不下来的问题,所以为了方便学习,这里我配置了maven的国内源。下边是我的配置过程。

Maven国内源配置

说明:因为我的本地没有settings.xml文件,所以这里直接创建的新文件,如果本地已经有,需要对文件进行检查。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NwmTuw4j-1683279643214)(F:\typora插图\image-20230505153436971.png)]

如果本地没有,就创建一个同名文件,并将此文件中的内容复制到里边。

文件之后我以资源的形式上传

注意:设置需要两次,一个是当前项目,一个新项目。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ochvDfu-1683279643214)(F:\typora插图\image-20230505153827086.png)]

检查过程:

未存在,创建,并检查是不是配置了国内源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faYOgESN-1683279643215)(F:\typora插图\image-20230505153532308.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLq4kJQr-1683279643215)(F:\typora插图\image-20230505153646948.png)]

3.添加启动类

最后在创建好的项目的java文件夹下创建一个启动类。

要求:包含一个main方法

启动类的作用其实也就是为了后边获取Bean对象做准备。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZW9vBG9-1683279643215)(F:\typora插图\image-20230505154738189.png)]

二、存Bean

Java中的对象在Sping项目中叫做Bean。

存Bean分为两步,分别

  1. 创建Bean
  2. 将Bean注册到Spring容器中

1.创建一个Bean

一般是创建一个实体类例如Student类、User类,这个模板/类产生的对象交由spring管理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAyI5jXT-1683279643216)(F:\typora插图\image-20230505160738485.png)]

2.将Bean注册到容器中

具体的注册方法就是在resources库下添加配置文件spring-config.xml(名字可自行定义,但推荐使用这个),除了固定的配置代码,再使用bean标签以<id=? class=?>的形式声明Bean:

<bean id="student" class="Student"></bean>

其中这里的id是bean的名称即类名的小写,class是bean的路径:包名+类名即类在java文件夹下的路径。一般是"com.xxx.……",这里只是演示没有分级,所以直接写类名即可。

固定代码:

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

所以本例中的spring-config.xml文件应该这样写:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvUqh65v-1683279643216)(F:\typora插图\image-20230505165447524.png)]

如果飘红,尝试使用enter+alt+enter方式解决。【本文件是xml的不是java的,idea不一定能正确识别】

三、取Bean并使用Bean

取Bean分为三步:

  1. 获取Spring上下文对象
  2. 通过Spring上下文对象获取指定Bean对象
  3. 使用Bean对象

注:以下操作均是再启动类的Main方法中进行

1.创建Spring上下文对象

创建Spring上下文对象一般使用ApplicationContext这个类,除此以外还可以使用BeanFactory这个类,两者略有区别,稍后再谈。

使用ApplicationContext创建上下文对象:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M82Q154L-1683279643216)(F:\typora插图\image-20230505163540274.png)]

注意:这里有个参数是之前定义过的配置文件,一定保证名字没写错!

【再次提醒:别高估自己的拼写能力=_=】

2.获取指定的Bean对象

可以看到,获取指定Bean常见的三种方式:

  • id
  • 类型即类名.class
  • id+类名.class

这里更推荐使用第三种。虽然前两种更加简洁,但是当Bean对象有多份的时候,存多次就会出错,稍后举例说明。这里先用起来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFnsNHJE-1683279643217)(F:\typora插图\image-20230505163834886.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOlplMIB-1683279643218)(F:\typora插图\image-20230505164134117.png)]

这样,就拿到指定Bean对象了。

此操作中注意事项:

  • Bean的id要一一对应
  • getBean虽然有很多重载,但是注意上边提到的前两种一个参数的和另一个两个参数的区别:当有一个类型被重复注册到spring-config.xml中,只能使用根据id+类型的方式获取指定Bean对象了。

3.使用Bean对象

这里我们的Student类只写了一个sayHi方法,所以这里使用bean对象的实例就只是用这个sayHi方法进行演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fz2z9LL-1683279643218)(F:\typora插图\image-20230505164630370.png)]

运行这个main方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhAJ1WBG-1683279643218)(F:\typora插图\image-20230505165354119.png)]

这样就算大功告成了~

如果出现类似这样的报错IOException parsing XML document from class path resource [spring-cnofig.xml],但是有感觉自己没错,尝试检查classes文件下是不是有,JVM是不是运行的原来的缓存。

ApplicationContext和BeanFactory区别

观察下边的代码及运行结果:

操作:

  1. 再定义一个实体类Teacher,并注册到Spring容器中

  2. 按照推荐方法取出Student类型的bean

  3. 只调用student1的sayHi方法

观察运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQI5OT8S-1683279643219)(F:\typora插图\image-20230505171634345.png)]

可以发现,当Spring容器中管理多个类型的Bean时,采用这两种方式运行结果不同。通过看源代码的层级结构,我们可以知道:ApplicationContext是继承于BeanFactory的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EszYdNJQ-1683279643219)(F:\typora插图\image-20230505171912005.png)]

总结:

联系:从继承关系而言,ApplicationContext和BeanFactory都是Spring容器的两个顶级的接口,并且ApplicationContext是继承于BeanFactory的;从功能角度而言,ApplicationContext和BeanFactory都有获取Spring上下文对象的功能。

区别:从功能角度而言,前者除了继承后者所有功能外还具有独特特性,添加了对国际化、资源访问及事件传播等方面的支持;从性能角度而言,前者是一次性加载并初始化所有的Bean对象,取Bean对象平均速度更快,后者是需要使用才去加载,更加轻量。

Spring存取Bean对象的基本流程

Spring读取Bean流程

  • 首先读取xml配置,扫描类文件,从配置或者注解中获取Bean的定义信息
  • 将获取的这些信息注册到Spring容器中

Spring加载/Bean流程

  • 先实例化Bean即分配内存空间
  • 再设置Bean中的属性
  • 再进行Bean的初始化

容器中同类型有多份Bean时,获取指定Bean

使用id:

没有出错,每次需要强转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUG4REW5-1683279643219)(F:\typora插图\image-20230505172916165.png)]

使用类型:

编译通过,运行出错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azGeMLTr-1683279643219)(F:\typora插图\image-20230505173155162.png)]

id+名称:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQhwUAZs-1683279643220)(F:\typora插图\image-20230505173404644.png)]

因此,为了代码的简洁性和唯一定位Bean的需求我们更推荐第三种方式。

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

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

相关文章

Ubuntu显示美化 优化 常用插件

Ubuntu显示美化 优化 常用插件 1. 安装 Extension Manager2. 网速显示&#xff08;不显示总流量记得关掉&#xff09;3. 顶部透明度4. 左侧dock导航透明度5. 过渡动画2022-01-22 毛玻璃效果 和 程序启动背景墙效果2022-01-23 窗口预览&#xff08;类windos多窗口&#xff09;20…

C++11实现线程池

1.所有权的传递 适用移动语义可以将一个unique_lock赋值给另一个unique_lock,适用move实现。 void myThread1() {unique_lock<mutex> myUnique (testMutex1,std::defer_lock);unique_lock<mutex>myUnique1(std::move(myUnique));//myUnique 则实效 myUnique1 相当…

在Linux中进行Jenkins部署(maven-3.9.1+jdk11)

Jenkins部署在公网IP为x.x.x.x的服务器上 maven-3.9.1要安装在jdk11环境中 环境准备 第一步&#xff0c;下载jdk-11.0.19_linux-x64_bin.tar.gz安装包。 登录地址&#xff1a;Java Downloads | Oracle 下载jdk-11.0.19_linux-x64_bin.tar.gz安装包&#xff0c;然后使用Win…

电子温湿度记录仪

电子温湿度记录仪&#xff1a;实时监测环境温度和湿度电子温湿度记录仪是一种用于实时监测环境温度和湿度的设备。它广泛应用于医疗、制药、食品加工、仓储、博物馆、实验室等领域&#xff0c;以确保环境温湿度处于合适的范围内&#xff0c;以保持物品和设备的稳定性和安全性。…

信号的产生——tripuls函数

信号的产生——tripuls函数, 功能&#xff1a;产生非周期三角波信号&#xff0c;其调用格式如下&#xff1a; &#xff08;1&#xff09;ytripuls(t)&#xff0c; &#xff08;2&#xff09;ytripuls(t,w)&#xff0c; &#xff08;3&#xff09;ytripuls(t,w,s)&#xff0…

Java多线程入门到精通学习大全?深入了解线程:生命周期、状态和优先级!(第二篇:线程的基础知识学习)

本文详细介绍了线程的基础知识&#xff0c;包括什么是线程、线程的生命周期、线程的状态和线程优先级等。在了解这些知识后&#xff0c;我们能够更好地掌握线程的使用方式&#xff0c;提高程序的并发性和效率。如果您对线程有更深入的问题&#xff0c;也欢迎向我们提问。 1. 什…

华为MPLS跨域——后门链路实验配置

目录 配置PE与CE设备对接命令&#xff08;通过OSPF对接&#xff09; 配置后门链路 可以使用任意方式来跑跨域MPLS&#xff08;A、B、C1、C2都可以&#xff09;&#xff0c;不过关于传递Vpnv4路由的配置此处不做介绍&#xff1b;此处只介绍关于PE和CE对接的配置和关于后门链路…

node.js的核心模块

node的核心模块由一些精简而高效的库组成 文章目录 全局对象全局对象和全局变量processcosole utilutils.inheritsutils.inspect 事件机制事件发射器error 事件继承EventEmitter 文件系统访问fs.readFile(filename,[encoding],[callback(err,data)])fs.readFileSync(filename,…

NSSCTF (2)

[GKCTF 2020]cve版签到 查看响应头发现有几个可能利用的信息 1.hint 里面的Flag in localhost 2.apache 2.4.38 3. php 7.3.15 我们发现第一个是提示 第二个apache版本没有什么漏洞 但是php 7.3.15 存在cve漏洞 这里题目规定 *.ctfhub.com 所以我们 要以这个结尾 在 p…

05-事务管理

概念&#xff1a; 事务是一组操作的集合&#xff0c;它是不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 操作&#xff1a; 开启事务&#xff08;一组操作开始前&#xff0c;开启事务) : start transaction / begin ; 提交事务&#xff08;这组操…

【LeetCode】1000题挑战(230/1000)

1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 目录 1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 第一题&#xff1a;242. 有效的字母异位词 - 力扣&#xff08;Leetcode&#xff09; 题目接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; …

罗马数字转整数:探究古代数字编码的奥秘

本篇博客会讲解力扣中“13. 罗马数字转整数”这道题的解题思路。 大家先来审下题&#xff1a;题目链接。 题干如下&#xff1a; 有几个输出样例&#xff1a; 提示如下&#xff1a; 大家先思考一下&#xff0c;再来听我讲解。 本题的关键是&#xff1a;如何把罗马数字转换…

文末赠书3本 | 盼了一年的Core Java最新版卷Ⅱ,终于上市了

文章目录 盼了一年的Core Java最新版卷Ⅱ&#xff0c;终于上市了&#xff01;Core Java基于Java 17全面升级Core Java最新版卷Ⅱ现已上市卷Ⅰ、卷Ⅱ有何不同&#xff1f;如何阅读《Java核心技术》从未远离工业界的Java大神带你学50位行业专家、技术媒体赞誉推荐如何选择版本文末…

Python基础入门(2)—— 什么是控制语句、列表、元组和序列?

文章目录 01 | &#x1f684;控制语句02 | &#x1f685;列表03 | &#x1f688;元组04 | &#x1f69d;序列05 | &#x1f69e;习题 A bold attempt is half success. 勇敢的尝试是成功的一半。 前面学习了Python的基本原则、变量、字符串、运算符和数据类型等知识&#xff0c…

树形结构——堆的构建

在学习完我们的树形结构之后我们再来使用树形结构的思想构建一个堆。使用堆可以对我们的数据进行排序&#xff0c;并且堆排序的效率要远优于我们之前学习过的冒泡排序。下面我们来逐步实现堆这个数据结构。 在构建堆之前我们需要先介绍以下我们树形结构构建的两种形式&#xff…

掌握这些GitHub搜索技巧,你的开发效率将翻倍!

作为开发it行业一员&#xff0c;学习借鉴他人项目是很有必要的&#xff0c;所以我们一般都会从github或者 Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是一般我还是在github上看项目比较多&#xff0c;毕竟人家实力项目量摆在那里 &#xff0c;但是国内访问gi…

Spring Cloud的那些组件和功能,get到了吗

Spring Cloud 是 Spring 技术栈生态很重要的一部分&#xff0c;面向大型网站服务端的开发和架构设计&#xff0c;它以 Spring/SpringBoot 为基础&#xff0c;提供的一系列组件规范和具体实现。 一、概述 Spring Cloud 提供了用于更快速构建分布式系统的基础规范&#xff08;例…

“深入”理解字节对齐

文章目录 前言思考查阅资料[Byte alignment and ordering](https://www.eventhelix.com/embedded/byte-alignment-and-ordering/)Byte Alignment RestrictionsWhy Restrict Byte Alignment?Compiler Byte PaddingUser Defined StructureActual Structure Definition Used By t…

使用SaleSmartly自动化流程的 5 个原因

想象一下&#xff0c;如果您可以采用智能数字解决方案来减轻团队和公司的手动和重复业务流程负担。它可以帮助您节省时间、提高公司的底线、消除冗余并增强数据管理。SaleSmartly&#xff08;ss客服&#xff09;就是这样。 通过利用自动化的力量&#xff0c;SaleSmartly&#x…

牛客网专项练习Pytnon分析库(一)

1.提取出a和b两个数组中的公共项,可以使用numpy库中的哪个函数&#xff08;A&#xff09;。 A.np.intersect1d(a,b) B.np.setdiff1d(a,b) C.np.where(a b) D.np.lexsort((a,b)) 解析&#xff1a; A选项&#xff0c;np.intersect1d用来获取数组a和数组b之间的公共项&…