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框架更加简洁好用。

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

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

相关文章

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC&#xff08;多版本并发控制&#xff09;机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务&#xff0c;在写入新数据时不会直接替换旧数据&#xff0c;而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时&#xff0c;会导致读…

在Linux终端查找指定类型的文件并统计数量

下面举例说明&#xff1a; find /path/to/directory -type f -exec file {} \; | grep "MIDI"它的作用是在指定的目录&#xff08;/path/to/directory&#xff09;中搜索所有的文件&#xff08;-type f&#xff09;&#xff0c;然后使用file命令检查每个文件的类型&a…

【C++学习】C++11新特性(第二节)—— 右值引用与移动语义超详解

文章目录 文章简介二.右值引用1.什么是左值&#xff0c;什么是右值&#xff1f;什么是左值引用&#xff0c;什么是右值引用&#xff1f;2.左值引用与右值引用比较 三.右值引用使用场景和意义1.左值引用的使用场景&#xff1a;2.左值引用的短板&#xff1a;3.右值引用与移动构造…

Axure RP中的相关概念及高保真原型构建方法

1 Axure RP中概念介绍 对于构建高保真原型来说&#xff0c;需要知道事件&#xff08;Event&#xff09;、Case、Action等概念。Axure RP中给出这些概念&#xff0c;是为了方便原型的构建&#xff0c;尤其是高保真原型的构建。 事件&#xff08;Event&#xff09;是附着于控件…

2024年万字长文-数据仓库面试题及参考答案全解析

数据仓库作为大数据分析的基石,对于大数据架构师而言,掌握其核心概念和技能至关重要。本文将深入探讨数据仓库相关的面试题,并提供详尽的参考答案,旨在帮助读者全面理解数据仓库的构建、管理和优化,以及如何在实际工作中应用相关知识。 目录 1. 数据仓库的定义及其与数据…

独孤思维:副业没做起来,要退钱

01 有些人&#xff0c;纯粹得可爱。 问我&#xff0c;项目没做起来&#xff0c;是不是该退钱&#xff1f; 那我反过来问你&#xff0c;你赚了钱&#xff0c;是不是该分我点&#xff1f; 02 昨天周一&#xff0c;是独孤最忙的时候。 因为各种大会小会&#xff0c;开了4个会…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…

buuctf之jarvisoj_level2

一、查看属性 首先还是必要的查看属性环节&#xff1a; 可以知道该文件是一个x86架构下的32位小段ELF程序&#xff0c;开启了栈不可执行&#xff08;NX&#xff09;保护&#xff0c;ret2shellcode是不行的 简单执行可以看到有一个简单的输入后输出hello world 二、静态分析 …

程序员学CFA——数量分析方法(二)

数量分析方法&#xff08;二&#xff09; 数理统计基础统计学的基本概念描述性统计学与推断性统计学总体与样本四种度量尺度名义尺度排序尺度区间尺度比率尺度 数据的展现频率分布直方图与频数多边形 中心趋势均值算术平均几何平均调和平均数加权平均 中位数众数 离散程度绝对离…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

【40分钟速成智能风控8】智能反欺诈模型2

目录 ​编辑 智能反欺诈模型 图计算 智能信用风险模型 专家模型 逻辑回归 决策树 集成树 深度神经网络 循环神经网络 智能反欺诈模型 图计算 图计算&#xff08;Graph Computing&#xff09;是以关联图谱为基础引申出来的一类算法的统称&#xff0c;主要解决了图数…

vue动态绑定style样式之动态添加style样式的多种写法

项目中会需要动态添加 style 行内样式&#xff0c;现指出常用的几种方式。 注意: 1、凡是有 - 的style属性名都要变成驼峰式&#xff0c;比如font-size要变成fontSize。 2、除了绑定值&#xff0c;其他的属性名的值要用引号括起来&#xff0c;比如fontSize:14px而不是 fontSize…

设计模式,模板方法模式、原型模式

模板方法模式 模板方法模式&#xff0c;就是将一些具体层都会有重复的内容&#xff0c;都放在抽象层作为具体层的模板&#xff0c;让具体层的代码能更简洁&#xff0c;也更好地实现代码复用。 代码实现 若有一套试卷&#xff0c;有A和B两个学生来作答&#xff0c;其中的题目…

windows linux服务器 以及Azure平台 密码策略配置

密码策略配置 windows 服务器Ubuntu 服务器安装libpam-pwquality密码质量检查库设置密码过期的天数密码策略限制使用过去使用过的密码 centos 7 服务器设置密码过期的天数设置最小密码长度限制使用过去使用过的密码 Azure云默认密码策略 windows 服务器 WinR或右键开始—运行—…

保持清醒!

hell&#xff0c;我是小索奇&#xff0c;今天读了几篇文章&#xff0c;聊一下清醒这个话题 其实生活真的需要长远的清醒&#xff0c;意味着我们不仅要看到眼前的快乐和挑战&#xff0c;还要有足够的远见和智慧去规划未来。比如你今天可繁忙&#xff0c;就很容易被眼前的琐事所迷…

Java工具类:对比两个集合并返回差异

在实际的软件开发过程中&#xff0c;经常会遇到需要对比两个集合并找出它们之间的差异的情况。为了解决这个问题&#xff0c;我们可以编写一个Java工具类来完成这个任务。本文将介绍如何编写这样一个工具类&#xff0c;并提供详细的代码解释和使用示例。 问题描述 假设我们有两…

头歌-机器学习 第12次实验 Adaboost算法

第1关&#xff1a;什么是集成学习 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.什么是集成学习。 什么是集成学习 集成学习方法是一种常用的机器学习方法&#xff0c;分为b…

Vue2.x实现商城购物车

1.实现购物车页面 在页面中显示购物车中的商品信息&#xff0c;并能进行数量增减及商品删除操作&#xff0c;购物车中金额也随商品数量的变化而变化 2.创建cart.html页面 创建cart.html页面&#xff0c;在其中创建Vue实例&#xff0c;实例中首先准备一些商品信息以供显示&a…

天软特色因子看板 (2024.4 第3期)

该因子看板跟踪天软特色因子A05005(近一月单笔流出金额占比(%)&#xff0c;该因子为近一月单笔流出金额占比(% 均值因子&#xff0c;用以刻画下跌时的 单成交中可能存在的抄底现象 今日为该因子跟踪第3期&#xff0c;跟踪其在SH000852 (中证1000) 中的表现&#xff0c;要点如下…