Spring创建、Bean对象的存储和读取

news2025/7/20 17:11:28

文章目录

  • 1、创建Spring项目
    • 1.1 创建Maven项目
    • 1.2 添加 Spring 框架支持
    • 1.3 添加启动类并添加main(非必要步骤)
  • 2、存储Bean对象
    • 2.1 添加Spring配置文件(第一次添加)
    • 2.2 创建Bean对象
    • 2.3 将Bean对象注册到Spring容器中
  • 3、读取并使用Bean对象
    • 3.1 创建 Spring 上下文
    • 3.2 获取指定的 Bean 对象
    • 3.3 使用Bean
  • 整体流程

1、创建Spring项目

使用Maven方式来创建一个Spring项目,创建Spring项目和Servlet项目大体是类似的,总共分三步

  1. 创建⼀个普通 Maven 项⽬
  2. 添加 Spring 框架支持(spring-context、spring-beans)
  3. 添加启动类并添加main(非必要步骤)

1.1 创建Maven项目

创建Maven项目的过程,我在之前的博客已经总结了,在这里就再过多赘述,可以自行查看–》创建Maven项目
不过我这的项目名字叫做spring-1

项目创建完成后,目录大概是这个样子

在这里插入图片描述

注意,这里的java是一个蓝色目录,表示用来存放java文件的根目录,在这个目录下能创建java class文件,但在其他目录下,就不能创建java class文件

1.2 添加 Spring 框架支持

在项⽬的 pom.xml 中添加 Spring 框架的⽀持,xml 配置如下:

<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>

从上述配置中可以看出,添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块

添加操作完成后,如果是第一次建Spring项目的话,字体可能是红色的,因此需要我们手动点击刷新一下,才能将这两个jar导入

如果导入失败的话,此时很大概率说明你没有配置国内源
配置国内源

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
  </pluginGroups>
  <proxies>
  </proxies>
  <servers>
  </servers>
  <mirrors>
   <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
      </mirror>
  </mirrors>
  <profiles>
  </profiles>
</settings>

将这段xml代码保存起来,并起名为settings.xml

在这里插入图片描述

在这里插入图片描述

经过以上步骤,再次手动刷新,就能导入jar包了。如果此时字体还是红色的,或者字体不是红色的,但一运行就报错,很有可能你之前没有配置国内源,导致去下载jar包时,不是一个完整的jar包。现在你有去配置国内源,去下载jar包,它会自动监测,发现你本地仓库里有这个jar包,就不会再去下载了

如何解决?

在这里插入图片描述

找到这个目录,将里面已经下载好的jar包,全部删掉,重新下载一遍。如果现在还是不行,就很有可能是网络太差

1.3 添加启动类并添加main(非必要步骤)

这个步骤是非必要的,那为什么还要进行这步操作呢?
我们测试Bean对象的存入和取出,不需要依赖Tomcat,因此就需要一个测试的类

在java目录下添加一个启动类,启动类的名字叫啥都行,在这个类中写一个main方法,随便来一条打印语句,如果能运行成功,表明Spring项目就创建成功了

在这里插入图片描述

2、存储Bean对象

存储 Bean 分为以下 3/2步:

  1. 如果是第一次添加,现在Spring项目中添加配置文件,非第一次此步骤省略
  2. 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean 对象
  3. 将创建的 Bean 注册到 Spring 容器中

2.1 添加Spring配置文件(第一次添加)

在resources中新建一个文件,名字一般为spring-config.xml,起到见名知意的效果,表明它是一个关于spring的配置文件

在这里插入图片描述

并将以下xml代码拷贝到该文件中

<?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>

2.2 创建Bean对象

在java目录下,随便建一个Bean对象即可

在这里插入图片描述

2.3 将Bean对象注册到Spring容器中

2.1步骤中,我们已经配置好了spring-config.xml文件,注册就是将bean节点放在<beans>中,具体添加如下配置

在这里插入图片描述

id就是你给这个bean取个名字,名字叫啥都行,取的时候也要按名字来取,但是我们尽量取个有标识性的名字(bean id 通常使用小驼峰)
class就是实际要存储的bean对象

整体含义:将com下的,beans下的User对象存入到Spring中,并取名为User

3、读取并使用Bean对象

获取并使用 Bean 对象,分为以下 3 步:

  1. 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下⽂。
  2. 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
  3. 使⽤ Bean 对象。

如果取多个 Bean 的话重复以上第 2、3 步骤

3.1 创建 Spring 上下文

Spring 上下文对象可使用 ApplicationContext,在启动类中的main方法中添加如下代码:

//得到 Spring 的上下⽂对象
ApplicationContext context = new 
	ClassPathXmlApplicationContext("spring-config.xml");

除了 ApplicationContext 之外,我们还可以使⽤ BeanFactory 来作为 Spring 的上下⽂,如下代码所示:

BeanFactory beanFactory = new XmlBeanFactory(new 
	ClassPathResource("spring-config.xml"));

经典面试题:ApplicationContext 和 BeanFactory 有什么区别?

相同点

都可以实现从容器中获取 bean,都提供了 getBean 方法

不同点

1.ApplicationContext 属于 BeanFactory 的⼦类, BeanFactory 只提供了基础访问 Bean 的方法,而 ApplicationContext 除了拥有 BeanFactory 所以功能之外,还提供了更多方法的实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持
2.从性能方面来说二者是不同的,BeanFactory 是按需要加载 Bean,属于懒汉模式。而ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,属于饿汉模式

可以创建一个Test类,进行测试

public class Test {
    public Test() {
        System.out.println("加载了Test");
    }
}

使用ApplicationContext
在这里插入图片描述

ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的

使用BeanFactory
在这里插入图片描述
这里的XmlBeanFactory方法被划上线的原因是这个方法比较老,说不定会在未来的某一天将它舍弃

3.2 获取指定的 Bean 对象

根据bean name(id) 来获取 bean

//2.根据上下文对象提供的方法获取到bean
User user = (User) context.getBean("user");

getBean中的参数就是bean的id

在这里插入图片描述

并且返回值是Object,需要我们进行类型转换

在以往中,获取对象,是需要我们通过new来构造一个对象的,构造的参数也要和构造方法中参数保持一致。而在这里,我们并不需要关系

根据 bean type 获取 bean

User user = (User) context.getBean(User.class);

当同一个类型被注入到spring中多次时,就会报错,例如:

在这里插入图片描述

在这里插入图片描述

根据 bean name(id) 和类型获取 bean

User user = context.getBean("user", User.class);

这种方式解决了同一个类型被注入到spring中的问题,也不需要进行类型转换,最多返回null。反观根据 bean name(id) 获取 bean 这种方式,它是可能存在强转null的情况。

3.3 使用Bean

直接通过上述获取到的bean对象,调用sayHi方法

user.sayHi("冯同学");

在这里插入图片描述

整体流程

在这里插入图片描述

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

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

相关文章

秋招挂麻了,就差去送外卖了,10w字Java八股啃完,春招必拿下

最近看到一名前腾讯员工发的帖子&#xff0c;总结的近期面试结果&#xff0c;真的就是那三个字&#xff1a;挂麻了…… 一个毕业后就在腾讯的高级程序员&#xff0c;由于种种原因&#xff0c;离职出来了。趁着金九银十求职季&#xff0c;互联网大厂小厂面试了一圈&#xff0c;感…

AcWing 搜素与图论

搜索 DFS 全排列 代码 #include<iostream> using namespace std;int vis[10], a[10];void dfs(int step, int n) {if (step n 1){for (int i 1; i < n; i)printf("%d ", a[i]);printf("\n");return;}for (int i 1; i < n; i){if (!vis[i…

计算机网络笔记5 传输层

文章目录前言一、运输层概述二、运输层的端口与复用、分用的概念三、UDP协议 和 TCP协议 对比用户数据报协议 UDP&#x1f4a6;&#xff08;User Datagram Protocol&#xff09;传输控制协议 TCP&#x1f4a6;&#xff08;Transmission Control Protocol&#xff09;四、TCP协议…

作用域和作用域链

文章目录1.作用域&#xff08;Scope&#xff09;1.1 什么是作用域1.2 全局作用域1.3 函数作用域1.3 块级作用域2. 作用域链2.1 自由变量2.2 作用域链2.3 *自由变量的取值2.4 作用域与执行上下文的区别3.总结1.作用域&#xff08;Scope&#xff09; 1.1 什么是作用域 当前的执…

easy-rules规则引擎最佳落地实践

写作目的 这是一个头部互联网公司中的一个问题。因为有很多业务产品线&#xff0c;作为一个新人或者团队外的人员是很难区分不同的产品线之间的区别的&#xff0c;因此需要给某个产品线一个描述。但是随着业务的发展&#xff0c;产品线下可能又根据某个字段进一步划分&#xf…

招生CRM系统|基于Springboot实现培训机构招生CRM管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Mongodb操作基础 分片

Mongodb分片 MongoDB分片是MongoDB支持的另一种集群形式&#xff0c;它可以满足MongoDB数据量呈爆发式增长的需求。当MongoDB存储海量的数据时&#xff0c;一台机器可能无法满足数据存储的需求&#xff0c;也可能无法提供可接受的读写吞吐量&#xff0c;这时&#xff0c;我们就…

基于内容的个性化推荐算法

一、什么是推荐算法 随着移动互联网的高速发展与智能手机的普及&#xff0c;海量的有用信息虽然为人们提供了更多的价值&#xff0c;然而信息的泛滥也意味着为了寻找合适的信息必须付出更多的时间成本。事实上&#xff0c;有时候仅仅是浏览和简单的查询来寻找有用的信息变得相…

「强烈收藏」Python第三方库资源大全,1000+工具包

前言 awesome-python 是 vinta 发起维护的 Python 资源列表&#xff0c;内容包括&#xff1a;Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。 &#xff08;文末送读者福利&#xff09; …

超全!程序员必备的20个学习网站,看这一篇就够了!

之前一直想出个程序员学习清单&#xff0c;终于腾出时间弄出来了&#xff0c;也趁此机会整理了收藏夹。 此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。 话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01;…

CMake中include_directories的使用

CMake中include_directories命令用于在构建(build)中添加包含目录,其格式如下: include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 将给定的目录添加到编译器(compiler)用于搜索包含文件的目录。相对路径被解释为相对于当前源目录。 包含目录被添加到当前C…

【网络】tcpdump、Wireshark 案例超详细介绍

文章目录网络分层应用层找到服务器的 IP查接口、对象的耗时删除指定网站的Cookie表示层、会话层tcpdump、wireshard传输层telnet: 路径可达性测试nc: 路径可达性测试netstat&#xff1a;查看当前连接状态iftop&#xff1a;查看当前连接的传输速率netstat -s: 查看丢包和乱序的统…

万字 HashMap 详解,基础(优雅)永不过时

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了散列表的整体设计思想&#xff0c;在后续几篇文章里&#xff0c;我们将以 Java 语言为例&#xff…

【王道计算机组成原理Note】5.5 指令流水线

5 指令流水线 5.1 指令流水的定义 一条指令的执行过程可以分成多个阶段(或过程)。根据计算机的不同&#xff0c;具体的分法也不同。 取指&#xff1a;根据Pc内容访问主存储器&#xff0c;取出一条指令送到IR中。分析&#xff1a;对指令操作码进行译码&#xff0c;按照给定的寻…

Visio 安装暴雷记录

Visio 安装记录起因&#xff1a; office2016家庭学生版中&#xff0c;安装visio2021后&#xff0c;插入word的vsdx图形右键显示unkown类型&#xff0c;无法识别&#xff0c;给学习工作带来很多麻烦&#xff01;   搜查一圈没找到对应可用的方法&#xff0c;想着可能是visio20…

MobPush for Flutter

集成准备 这是一个基于 MobPush 功能的扩展的 Flutter 插件。使用此插件能够帮助您在使用 Flutter 开发应用时&#xff0c;快速地实现推送功能。 在pubspec.yaml文件中加入下面依赖 dependencies:mobcommonlib:mobpush_plugin: 然后执行&#xff1a;flutter packages get 导…

倍增(小试牛刀)

二分每次折半&#xff0c;倍增每次2的倍数 原理先存储每个小区间的最值也就是初始化&#xff0c;之后直接查询 1. 把数列按倍增分成小区间 对数列的每个元素&#xff0c;把从它开始的数列分成长度为1、2、4、8、…的小区间。下图给出了一个分区的例子&#xff0c;它按小区间…

java--JVM

JVM1.JVM的内存结构2.哪些部分会出现内存溢出3.方法区与永久代、元空间之间的关系4.JVM内存参数5.JVM垃圾回收算法&#xff08;1&#xff09;标记清除&#xff08;2&#xff09;标记整理&#xff08;3&#xff09;标记复制6.GC和分代回收算法7.三色标记和并发漏标问题8.垃圾回收…

【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)

CuratorFramework基本介绍 CuratorFramework是Netflix公司开源的一套Zookeeper客户端框架&#xff0c;它作为一款优秀的ZooKeeper客户端开源工具&#xff0c;主要提供了对客户端到服务的连接管理和连接重试机制&#xff0c;以及一些扩展功能&#xff0c;它解决了很多ZooKeeper…

Linux服务器配置与管理(基于Centos7.2)任务目标(四)

文章目录一、任务目标二、任务资讯三、任务实施3-1.RPM软件包管理3-2.YUM方式安装软件一、任务目标 实施该工单的任务目标如下&#xff1a; 知识目标 1.了解RPM提供的功能。 2.了解YUM相对于RPM所具有的优点。 能力目标 1.能够通过RPM安装及管理软件包。 2.能够通过YUM安装及管…