【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录

  • 前言
  • 一、Spring 项目的创建
    • 1.1 创建 Maven 项目
    • 1.2 添加 Spring 框架支持
    • 1.3 添加启动类
  • 二、储存 Bean 对象
    • 2.1 创建 Bean
    • 2.1 将 Bean 注册到 Spring 容器
  • 三、获取并使用 Bean 对象
    • 3.1 获取Spring 上下文
    • 3.2 ApplicationContext 和 BeanFactory 的区别
    • 3.3 获取指定的 Bean 对象
  • 四、总结


前言

通过前面的文章我们知道了,Spring 其实就是一个包含了众多工具的 IoC 容器。既然是容器那么主要就涉及到两个操作,即:

  • 将对象储存到 Spring 容器中
  • 使用的使用将对象从 Spring 容器中取出

因此,学习 Spring 容器,主要就是学习它的存取操作。下文详细介绍了 Spring 项目的创建与使用。

一、Spring 项目的创建

下文将以 Maven 的方式来创建一个 Spring 项目,创建 Spring 项目的方式与 Servlet 类似,主要分为以下三步骤:

  1. 创建 Maven 项目;
  2. 添加 Spring 框架支持;
  3. 添加启动类。

以下就是围绕这三个步骤来创建 Spring 项目的具体过程。

1.1 创建 Maven 项目


创建好后其目录结构如下:

1.2 添加 Spring 框架支持

  1. 在 Maven 中央仓库搜索 Spring,选择 “Spring Context”:
  2. 选择 5.xxxx版本

  1. 选择 Maven,然后将其复制粘贴到 pom.xml 文件中


最后的 pom.xml文件样式如下:

1.3 添加启动类

即在 Java 目录下创建一个类,其中包含一个 main 方法即为启动类:

二、储存 Bean 对象

什么是 Bean:

在 Spring 框架中,Bean 是一个非常重要的概念,它是Spring容器中被管理和维护的对象。Bean 可以是任何的Java对象,例如 POJO(Plain Old Java Object)、实体类、服务类等。这些对象在 Spring 容器中被实例化、组装、管理和销毁,以提供各种功能和服务

储存 Bean 分为两个步骤:

  1. 先创建 Bean 类;
  2. 然后将创建的 Bean 注册到 Spring 容器中。

2.1 创建 Bean

此处以一个 Student 类为例:

public class Student {
    
    public Student(){
        System.out.println("init student");
    }
    
    public void sayHi(){
        System.out.println("Hi, I am a student.");
    }
}

2.1 将 Bean 注册到 Spring 容器

要想将 Bean 对象注册到 Spring 容器中,首先需要在 resources 目录下创建一个配置文件,一般取名为 spring-config.xml

Spring 配置文件的固定为以下内容:

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

然后将 Student 对象注册到 Spring 中,即在 <beans>添加以下配置:

其中 id 字段表示给 Bean 取的名,class 字段则是 包名 + 类名

三、获取并使用 Bean 对象

获取并使用 Bean 对象也大致可分为以下三步:

  1. 获取 Spring 上下文对象,因为对象都交给 Spring 管理了,所有要获取 Spring 中的 Bean,首先就需要获取 Spring;
  2. 通过回去的 Spring 上下文对象,获取指定的 Bean 对象;
  3. 使用 Bean 对象。

3.1 获取Spring 上下文

获取 Spring 上下文对象的方式主要有两个,即使用ApplicationContextBeanFactory来获取。

1. 使用ApplicationContext获取

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

2. 使用BeanFactory获取

    public static void main(String[] args) {
        BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    }

3.2 ApplicationContext 和 BeanFactory 的区别

此时,分别执行 ApplicationContextBeanFactory 获取 Spring 上下文对象的 main方法:

ApplicationContext


此时,可以发现当使用 ApplicationContext获取 Spring 上下文的时候,会立即初始化 Spring 容器中的 Bean 对象。

BeanFactory


当使用BeanFactory 获取 Spring 上下文的时候,并没有立即初始化 Spring 中的 Bean 对象,而是在获取 Bean 对象的时候才初始化,即是一种懒加载模式。

ApplicationContextBeanFactory之间的区别可总结如下:

继承关系和功能层面:

  • ApplicationContext 接口继承了 BeanFactory 接口,其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext 除了继承 BeanFactory的所有功能之外,还拥有独特的功能,比如添加了对国际化的支持、资源的访问支持、事件传播等方面的支持。

性能方面:

  • ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,而 BeanFactory 是需要哪个 Bean 对象的时候才会去加载,因此更加轻量。
  • 因此当性能要求较高而内存充足的场景下推荐使用 ApplicationContext;而在内存空间较小,对性能要求不高的场景下推荐使用BeanFactory

3.3 获取指定的 Bean 对象

  1. 直接通过 Bean 对象的名称获取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = (Student) context.getBean("student");

getBean方法直接通过 Bean 对象的名称获取返回的是一个 Object 对象,因此需要强制类型转换。

  1. 通过 Bean 的类型获取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = context.getBean(Student.class);

getBean方法通过 Bean 对象的类型获取,此时不需要进行强制类型转换,但是这种方法存在一个问题:如果当 Spring 容器中存在多个相同类型的 Bean 对象的时候就会出现歧义,即找不到返回哪个对象

比如在 Spring 容器中再添加一个 Student 对象:

此时启动 main 函数的时候,就会出现如下问题:


此时,Spring 容器中存在两个相同类型的 Bean 对象,而通过类型获取的话,就不知道获取哪一个了。因此要解决这个问题就可以采用 通过 Bean 名称 + 类型获取

  1. 通过 Bean 名称 + 类型获取
    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        Student student = context.getBean("student", Student.class);
        Student student2 = context.getBean("student2", Student.class);
        
        student.sayHi();
        student2.sayHi();
    }

此时,通过 Bean 名称 + 类型获取的方式,即使是 Spring 容器中存在多个相同类型的 Bean 对象,但由于其名称不同,也能够正确获取到指定的 Bean 对象。

四、总结

以上详细介绍了 Spring 项目的创建和使用过程,下面是对其整个流程的总结。

  1. 通过 Maven 项目创建 Spring 项目,并且还要添加对 Spring 框架的支持;
  2. 创建 Bean 对象,然后通过 spring-config.xml 配置文件将其储存到 Spring 容器中;
  3. 获取 Bean 对象:
    • 首先通过 ApplicationContext 或者 BeanFactory 获取配置文件,即获取 Spring 上下文对象。
    • 通过 getBean 方法获取 Bean 对象。
    • 使用 Bean 对象。

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

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

相关文章

Python web实战之 Django 的 MVC 设计模式详解

技术栈&#xff1a;Python、Django、HTML、CSS、JavaScript。 概要 在 Web 开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常常见的设计模式&#xff0c;它可以帮助我们更好地管理代码&#xff0c;提高代码的可维护性。今天就介绍如何使用 …

无人机巢的作用及应用领域解析

无人机巢作为无人机领域的创新设备&#xff0c;不仅可以实现无人机的自主充电和电池交换&#xff0c;还为无人机提供安全便捷的存放空间。为了帮助大家更好地了解无人机巢&#xff0c;本文将着重解析无人机巢的作用和应用领域。 一、无人机巢的作用 无人机巢作为无人机技术的重…

卷积神经网络【图解CNN】

文章目录 1.卷积运算2.池化3.全连接层 卷积神经网络可以看作一个函数或者黑箱&#xff0c;输入就是图片的像素阵列&#xff0c;输出就是这个图片是什么&#xff1f; 图片是X&#xff0c;那么就输出‘x’&#xff0c;图片是‘O’,那么就输出O&#xff1b; 在计算机眼中&#xff…

MySQL索引1——基本概念与索引结构(B树、R树、Hash等)

目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引&#xff0c;就是对数据库表中某些列的值通过不同的数据结…

C语言笔试题训练【第一天】

目录 第一题 第二题 第三题 第四题 第五题 大家好&#xff0c;我是纪宁。 从今天开始博主会日更一些经典的C语言笔试题&#xff0c;持续20天左右。题目类型为5道选择题加2道编程题&#xff0c;希望能和大家一起进步。 第一题 1.读程序&#xff0c;下面程序正确的输出是&…

【Java可执行命令】(十二)依赖分析工具jdeps:通过静态分析字节码并提取相关信息来实现依赖分析 ~

Java可执行命令之jdeps 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 可选参数&#xff1a;jdeps -dotoutput < dir>3.3 可选参数&#xff1a;jdeps -s3.4 可选参数&#xff1a;jdeps -v3.5 可选参数&#xff1a;jdeps -cp < path>3.6 注意事项&#xff1…

【雕爷学编程】 MicroPython动手做(35)——体验小游戏2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

TensorRT学习笔记--基于TensorRT部署YoloV3, YoloV5和YoloV8

目录 1--完整项目 2--模型转换 3--编译项目 4--序列化模型 5--推理测试 1--完整项目 以下以 YoloV8 为例进行图片和视频的推理&#xff0c;完整项目地址如下&#xff1a;https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.…

iPhone 8 Plus透明屏有哪些场景化应用?

iPhone 8 Plus是苹果公司于2017年推出的一款智能手机&#xff0c;它采用了全新的玻璃机身设计&#xff0c;使得手机更加美观和时尚。 而透明屏则是一种新型的屏幕技术&#xff0c;可以使手机屏幕呈现出透明的效果&#xff0c;给人一种科技感十足的视觉体验。 透明屏是通过使用…

Selenium Chrome Webdriver 如何获取 Youtube 悬停文本

导语 Youtube 是一个非常流行的视频分享平台&#xff0c;有时候我们可能想要爬取一些视频的信息&#xff0c;比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的&#xff0c;而是需要我们将鼠标悬停在某个元素上才能看到&#xff0c;比如视频的时长、上传时间…

Linux NUMA架构(非统一内存访问)

NUMA架构 NUMA Architecture| Non Uniform Memory Access Policy/Model | Numa Node Configuration (CPU Affinity) NUMA架构产生的原因 cpu的高速处理功能和内存存储直接的速度会严重影响cpu的性能。传统的计算机单核架构,cpu通过内存总线(内存访问控制器)直接连接到一…

Ubuntu安装harbor(http模式)并随便上传一个

Ubuntu安装harbor&#xff08;http模式&#xff09; docker和harbor的介绍就免了&#xff0c;都不知道啥东西&#xff0c;还安装搞毛 先安装docker环境 不要问&#xff0c;软件源之类的配置&#xff0c;挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…

【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka&#xff1f;二、为什么要有服务注册发现中心&#xff1f;三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。引入插件后&#xff0c;发现做不到只选择年级&#xff0c;不选择班级&#xff08;似乎&#xff0c;只能到最后子节点了&#xff09;。 需求中&#xff0c;有可能选择的不是叶子。比如&a…

力扣 C++|一题多解之动态规划专题(1)

动态规划 Dynamic Programming 简写为 DP&#xff0c;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xff0c;提出了著名的最优化原理&…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

openCV C++环境配置

文章目录 一、openCV 安装二、新建项目三、配置环境变量四、测试使用 编译器:vs2017 OpenCV:4.5.4 一、openCV 安装 将openCV安装到一个路径下&#xff0c;我安装到了D盘根目录下 二、新建项目 在vs2017新建控制台空项目&#xff0c;打开项目属性 在VC目录 -> 包含目录下…

基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统

状态监测系统能够在故障早期及时发现机械设备的异常状态&#xff0c;避免故障的 进一步恶化造成不必要的损失&#xff0c;滚动轴承是机械设备的易损部件&#xff0c;本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据&#xff0c;…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Dock…

【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】

文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…
最新文章