2. Spring的创建和Bean的存取

经过前面的学习我们已经大体明白了 IOC 思想以及它的实现方式 DI ,本节要讲的是如何Spring框架实现实现DI。

本节目标:

  1. Spring(Core) 项目创建
  2. 将对象存储到 Spring 中
  3. 将对象(bean)从 Spring 中取出

1. 创建 Spring 项目

与开篇演示的 Spring Boot 项目不同,罗马城不是一天建成的,Spring Boot 出来之前还是需要使用 Maven 构建一个 Spring 项目,与 Servlet 类似,但由于 IOC 和 DI 的加持,又更胜Servlet一筹,Spring 项目的创建分为以下三步:

  1. 创建一个普通Maven项目;
  2. 添加Spring框架依赖 spring-context、spring-beans(可以将spring-context理解为Spring本身,存储在Spring称之为bean,也就是spring-beans);
  3. 添加启动类;

1.1 创建Maven项目

1.2 添加Spring 框架依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>

添加完依赖记得检查一下:

image.png

1.3 添加启动类

2. 存储Bean对象

并不是真的存储,而是告诉Spring,此Bean需要托管给Spring

2.1 创建bean对象

Bean对象其实就是Java语言中的一个普通对象

public class UserBean {
    public void sayHi() {
        System.out.println("Hi!");
    }
}

2.2 创建配置文件

resource目录下创建一个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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

2.3 注册bean

image.png

<bean id="user" class="UserBean"></bean>

解释:bean的id是自己命名的,命名规范同样是小驼峰,取bean的时候会用到。class对应的就是自己创建的bean对象(包名+类名),我这里没有放包里,因此直接就是UserBean

3. 从 Spring 中取出 bean对象

3.1 得到Spring的上下文对象

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    }
}

ApplicationContext是一个接口,ClassPathXmlApplicationContext是它的实现类,由此得到Spring context对象

3.2 从Spring上下文中取出对象

getbean有如下这么多方法,这里先用最简单的通过beanId来获取bean对象:

//getbean方法里面的参数就是配置文件中bean对象的id
UserBean user = (UserBean)context.getBean("user");

3.3 使用bean对象

image.png

至此我们全程都没有使用过new对象的方式,成功从Spring中取出bean对象

3.4 理解bean的实例化

根据bean的class来获取bean

//1.根据一个String 参数获取bean
//UserBean user = (UserBean)context.getBean("user");
//2.根据一个Class 参数获取bean
UserBean user = context.getBean(UserBean.class);

由于传了UserBean.class这种方法不需要强转就能获取到bean,运行结果:

image.png

修改配置文件:

<bean id="user1" class="UserBean"></bean>
<bean id="user2" class="UserBean"></bean>

报错了,意思大概是找到了预料之外的两个bean对象user1、user2:
image.png

我们用第一种方式来查看一下两个bean对象的地址:

UserBean user1 = (UserBean)context.getBean("user1");
UserBean user2 = (UserBean)context.getBean("user2");
System.out.println("user1:" + user1);
System.out.println("user2:" + user2);

结果发现bean的id不同,即便他们是一个类,还是会实例化两个对象:

image.png

区分单例模式:单例模式指的是每一个bean对象都是单例的,而不是说一种类只能存在一个bean对象。

//取两次id为user1的bean,地址一样
UserBean user1 = (UserBean)context.getBean("user1");
UserBean user1Test = (UserBean)context.getBean("user1");

UserBean user2 = (UserBean)context.getBean("user2");

System.out.println("user1:" + user1);
System.out.println("user1Test:" + user1Test);
System.out.println("user2:" + user2);

结果发现确实是单例的:

image.png

4. Spring上下文对象

ApplicationContext context
        = new ClassPathXmlApplicationContext("spring-config.xml");

除了上面的那种写法,获取上下文对象还可以用下面这种写法——BeanFactory:

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

ApplicationContext 和 BeanFactory 的关系(面试常考)

共同点:都是用来获取Spring上下文对象

不同点:

  • 继承和功能:ApplicationContext 是 BeanFactory 的子接口,ApplicationContext具备了BeanFactory的所有功能。BeanFactory 只具备最基础访问bean的能力,ApplicationContext 具备更多能力,比如国际化支持、资源访问支持、以及事件传播等方面的支持。
  • 性能和加载方式 :ApplicationContext是饿汉模式一次性加载完所有Bean对象,BeanFactory是懒汉模式按需加载,更加轻量。随着硬件资源的升级,在资源充裕的情况下推荐使用ApplicationContext,使用户第一次使用bean对象时节省实例化bean对象并存储到Spring的开销。

5. 总结

Spring的创建和使用的过程:

  1. 创建Spring项目
  • 创建一个 Maven 项目
  • 添加 Spring 依赖
  • 创建一个启动类
  1. 将对象存储到 Spring
  • 创建一个 bean 对象
  • 创建配置 .xml 文件
  • 将 bean 注册到 Spring 的配置文件(id用于取对象,class表示存储bean的位置)

image.png

  1. 从Spring中取出 bean 对象
  • 先得到 Spring 上下文对象
  • 从 Spring 中取出bean对象并使用

这样使用Spring让我们初步理解到了DI的实现方式,但是我们发现并不便利,下一章节我们学习使用Spring的注解方式,让Spring框架更加简洁好用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024MathorCup数学建模B题成品论文26页+1-4小问代码全解析+答疑

B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 &#xff08;完整版见文末&#xff09; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有 极其重要的研究价值&#xff0c;不仅对中国文明的起源具有重要意义&#x…

解放双手,批量绕过403

将dirsearch扫描出来的结果复制到url.txt&#xff0c;如下所示 url.txt [21:18:16] 502 - 0B - /var/log/exception.log [21:18:21] 502 - 0B - /WEB-INF/jetty-env.xml [21:18:22] 502 - 0B - /WEB-INF/weblogic.xml [21:18:27] 502 - 0B - /wp-json/wp/v2/u…

云笔记小程序的实现

1.前言 云笔记, 是基于HotApp小程序统计云后台提供的api接口开发的一个微信小程序。 2.功能 离线保存笔记 云端数据同步, 更换了设备也可以找到以前的笔记 接入了好推二维码提供的数据统计工具, 可以到平台上查看用户分析、留存分析、事件分析。 3.界面效果 ***HotApp云笔…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …

OpenHarmony实战开发-Actor并发模型对比内存共享并发模型

内存共享并发模型指多线程同时执行复数任务&#xff0c;这些线程依赖同一内存并且都有权限访问&#xff0c;线程访问内存前需要抢占并锁定内存的使用权&#xff0c;没有抢占到内存的线程需要等待其他线程释放使用权再执行。 Actor并发模型每一个线程都是一个独立Actor&#xf…

【vs2019】window10环境变量设置

【vs2019】window10环境变量设置 【先赞后看养成习惯】求关注点赞收藏&#x1f60a; 安装VS2019时建议默认安装地址&#xff0c;最好不要改动&#xff0c;不然容易出问题 以下是安装完VS2019后环境变量的设置情况&#xff0c;C:\Program Files (x86)\Microsoft Visual Studi…

20240414,类的嵌套,分文件实现

笑死&#xff0c;和宝哥同时生病了 一&#xff0c;封装-案例 1.0 立方体类 #include<iostream>//分别用全局函数和成员函数判定立方体是否相等 using namespace std;class Cube { public:int m_area;int m_vol;int geth(){return m_h;}int getl() { return m_l; }int…

【群智能算法改进】一种改进的火鹰优化算法 改进的IFHO算法【Matlab代码#77】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始火鹰优化算法1.1 种群初始化1.2 火鹰点火阶段1.3 猎物移动阶段 2. 改进的火鹰优化算法2.1 Tent映射种群初始化2.2 非线性复合自适应惯性权重随机抉择策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源…

大模型实战案例:8卡环境微调马斯克开源大模型 Grok-1

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

【LeetCode: 705. 设计哈希集合 + 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

免费VPS云服务器汇总,最长永久免费使用

目前云服务器市场竞争很激烈&#xff0c;为了方便吸引上云&#xff0c;很多云计算服务商提供免费试用云服务器&#xff0c;下面给大家整理汇总一下免费VPS云服务器&#xff0c;最长永久免费使用&#xff01; 一、雨云&#xff08;优惠码:ABC&#xff09; 活动地址&#xff1a;…

通讯录的实现(顺序表版本)

我们知道通讯录是基于顺序表的前提下&#xff0c;要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。&#xff08;注意今天代码量有点多&#xff0c;坚持一下&#xff09;。冲啊&#xff01;兄弟们&#xff01; 顺序表的简单理解 对于顺序表&#xff0c;我们首…

软件测试 测试开发丨Pytest结合数据驱动-yaml,熬夜整理蚂蚁金服软件测试高级笔试题

编程语言 languages: PHPJavaPython book: Python入门: # 书籍名称 price: 55.5 author: Lily available: True repertory: 20 date: 2018-02-17 Java入门: price: 60 author: Lily available: False repertory: Null date: 2018-05-11 yaml 文件使用 查看 yaml 文件 pych…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

刷题之Leetcode206题(超级详细)

206.反转链表 力扣题目链接(opens new window)https://leetcode.cn/problems/reverse-linked-list/ 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 如果再定义一个新的链表&#xff0…

Linux文本编辑器vim使用和分析—2

目录 1.对vim的简单理解&#xff1a; 2.看待vim的视角&#xff1a; 3.命令模式&#xff1a; 3.1vim被打开后默认的模式&#xff1a; 3.2命令模式切换插入模式&#xff1a; 3.3其他模式回到命令模式&#xff1a; 3.4光标定位&#xff1a; 4.插入模式(编辑模式)&#xff1…

赋能未来:AI技术革新中的创业契机

目录 前言 一、行业解决方案 1、行业参考说明 2、操作步骤建议 二、智能产品和服务 1、行业参考说明 2、操作步骤建议 三、教育和培训 1、行业参考说明 2、操作步骤建议 总结 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的创业…

【Java】新手一步一步安装 Java 语言开发环境

文章目录 一、Windows 10 系统 安装 JDK8二、 Mac 系统 安装 JDK8三、IDEA安装 一、Windows 10 系统 安装 JDK8 &#xff08;1&#xff09;打开 JDK下载网站&#xff0c;根据系统配置选择版本&#xff0c;这里选择windows 64位的版本&#xff0c;点击下载&#xff08;这里需要…

音频变速python版

音频变速 如何能在不改变音频其他特点的情况下&#xff0c;只改变语速呢&#xff1f; 有几个python的库可以实现该功能&#xff0c;下面一一介绍。 pydub库 首先&#xff0c;确保安装了pydub和ffmpeg。 下面是一个简单的Python脚本&#xff0c;展示如何改变音频的播放速度&a…

《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

1.简介 TestNG为日志记录和报告提供的不同选项。现在&#xff0c;宏哥讲解分享如何开始使用它们。首先&#xff0c;我们将编写一个示例程序&#xff0c;在该程序中我们将使用 ITestListener方法进行日志记录。 2.TestNG自定义日志 2.1创建测试用例类 1.按照宏哥前边的方法&…