【JavaEE进阶】Spring 创建与使用

news2024/11/17 10:39:52

在这里插入图片描述

Spring 创建与使用


1,Spring项目的创建

使用Maven方式来创建一个Spring项目,创建Spring项目和Servlet类似,总共分为以下3步:

  1. 创建一个普通Maven项目
  2. 添加 Spring 框架⽀持(spring-context、spring-beans)
  3. 添加启动类

1.1,创建一个Maven项目

创建一个普通的Maven项目注意点:项目名称和项目路径中不能有任何中文。

image-20230707094943941

当 Java源代码根目录出现颜色以及resources资源目录出现标识图像时,说明该Maven项目已经初始化完毕。

image-20230707095538477

1.2,添加Spring框架依赖

在项目的 pom.xml 中添加 Spring 框架依赖(spring-context依赖),xml 配置如下:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.19</version>
    </dependency>
</dependencies>

在项目的 pom.xml 配置文件中添加spring-context依赖后,需点击刷新键重新加载Maven项目,操作如下:

image-20230707100320326

当在External Libra 目录下出现下述6个库,表明Spring-context依赖添加成功。

image-20230707100551575

疑问:我在pom.xml 中只添加了一个Spring-context依赖,但为啥最终会有6个依赖呢?

解答:Spring-context依赖的底层实现依赖于另外五个框架依赖,所以再添加Spring-context依赖的同时也会把这另外5个也添加。

1.3,添加启动类

在Java源代码根目录java下创建一个启动类,该启动类包含main方法即可。

该启动类的功能是:为后面从Spring容器中读取Bean做准备。

image-20230707101025123

测试Maven项目是否创建成功,可通过在main方法里写测试代码,根据代码能否成功运行来判断。

image-20230707101614936

注:上述测试代码能够正常运行,说明Maven项目创建以及配置成功。


2,存储Bean

2.1,创建Bean对象

Bean对象就是 Java 语⾔中的⼀个普通对象,只是该对象能够被多次调用并使用。

image-20230707102220350

2.2,将Bean注册到Spring

操作流程:在resources资源目录下添加 Spring 配置⽂件spring-config.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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

在resources资源目录下添加配置文件示意图:

image-20230707103329843

添加好配置文件后,再将Bean对象注册到 Spring 中就可以,具体操作是在 中添加如下配置:

image-20230707103611886

注:id 指明Bean对象名称,class 指明Bean对象路径(包名 + 类名)。

<bean id="student" class="org.example.Student"></bean>

上述表示含义为:将Bean(org.example.Student)存到Spring 容器中,它的名称叫作student


3,读取Bean

3.1,得到 Spring上下文

Spring 上下文对象的获取可使用 ApplicationContex,创建的时候需要配置 Spring 配置信息。

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

说明:ClassPathXmlApplicationContext属于ApplicationContext的⼦类,拥有ApplicationContext的所有功能,是通过 xml 的配置来获取Spring容器中所有的 Bean对象。

image-20230707104530977

注意:ClassPathXmlApplicationContext里的参数configLocation值应与Spring配置信息文件名相同。

3.2,获取指定Bean对象

获取指定Bean对象要求:getBean的参数值idclass要与指定Bean对象的idclass相对应。

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

获取指定Bean对象示意图:

image-20230707110153870

3.3,使用Bean对象

student.sayHi();

读取Bean对象并使用的总操作流程代码:

import org.example.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //1,获得Spring对象上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2,获取指定的Bean对象
        Student student = context.getBean("student", Student.class);
        //3,使用Bean对象(非必须)
        student.sayHi();
    }
}

读取Bean对象并使用的总操作流程代码执行结果:

image-20230707110725900


4,其他注意问题

4.1,获取Spring上下文的两种方式

1)ApplicationContext

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

ApplicationContext 执行操作代码:

public static void main(String[] args) {
    //1,获得Spring对象上下文
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    //2,获取指定的Bean对象
    Student student = context.getBean("student", Student.class);
    //3,使用Bean对象(非必须)
    student.sayHi();
}

执行 ApplicationContext 打印结果:

image-20230707112101914

2)BeanFactory

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

BeanFactory 执行操作代码:

public static void main(String[] args) {
    //1,获得Spring对象上下文
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    //2,获取指定的Bean对象
    Student student = beanFactory.getBean("student", Student.class);
    //3,使用Bean对象(非必须)
    student.sayHi();
}

执行 BeanFactoryt 打印结果:

image-20230707112157734

3)两种方式的区别

1,Student类(Bean对象)准备

public class Student {
    public Student(){
        System.out.println("do student init!");
    }

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

2,Teacher类(Bean对象)准备

public class Teacher {
    public Teacher(){
        System.out.println("do teacher init!");
    }

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

3,两种方式对比

执行 ApplicationContext (无获取指定的Bean对象操作) 打印结果:

image-20230707113429506

执行 BeanFactoryt (有获取指定的Bean对象操作) 打印结果:

image-20230707113921760

执行 BeanFactoryt (有获取指定的Bean对象操作) 打印结果:

image-20230707114511703

4,两种方式区别总结

ApplicationContext:该方式在获取Spring对象上下文时会对Spring容器中的所有Bean对象进行加载初始化。

方式特征:比较耗内存,一次性加载,后续Bean对象的读取不需进行加载初始化操作,效率高。

BeanFactory:该方式只有在调用getBean方法时才会进行加载初始化对应的Bean对象,而不是所有的Bean对象,属于懒加载。

方式特征:比较省内存,懒加载,只有当调用getBean时才会加载初始化对应的Bean对象,效率不高。

ApplicationContextBeanFactory的联系:

ApplicationContextBeanFactory都是接口,在使用时都是调用其的子类。

image-20230707185048579

两种方式对比区别:从继承功能方面和性能方面这两个方面进行比较说明。

  1. 继承关系和功能方面:BeanFactory 提供了基础的访问容器的能力,而ApplicationContext是BeanFactory的子类,它除了继承了BeanFactory的所有功能之外,它还拥有独特的特性还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。
  2. 性能方面:ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个才去加载并初始化哪个,因此BeanFactory更加轻量,但效率不高。

4.2,获取Bean对象的三种方式

1)通过名称获取

Student student = (Student) context.getBean("student");

该方式需经过两步操作,先获取到Bean对象,再经过强制类型转换为对应的类型,而强制类型转换容易出现空指针异常,不优雅。

如果Bean对象名称不存在,则会抛出NoSuchBeanDefinitionException异常。

image-20230707115428718

2)通过类名获取

Student student = context.getBean(Student.class);

该方式存在缺陷,当有⼀个类型被重复注册到 spring-config.xml 中时,不可使用该方式,若使用则会抛出NoUniqueBeanDefinitionException异常(非唯一的Bean异常)。

image-20230707123153944

3)通过名称+类名获取

该方式推荐使用,既避免了强制类型转换带来的空指针异常问题,也避免了只根据类名获取Bean方式带来的非唯一的Bean异常问题。

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

本文总结

1,Spring 创建与使用流程?

解答:Spring 创建与使用的流程分为三大步,分别为Spring项目的创建,Bean对象的存储以及Bean对象的读取。具体流程为:

1)Spring项目的创建

  1. 创建一个Maven项目
  2. 添加Spring框架依赖 【spring-context】
  3. 添加启动类 【功能:为后面从Spring容器中读取Bean做准备】

2)存储Bean

  1. 创建Bean对象
  2. 将Bean注册到Spring容器中 【spring-config.xml配置文件】

3)读取Bean

  1. 得到Spring 对象【ApplicationContext,BeanFactory】
  2. 通过Spring 对象的 getBean() 方法获取到Bean对象 【DI操作】
  3. 使用Bean对象 【非必须】

Spring 创建与使用的流程示意图:


2,获取Spring的两种方式?区别?

1)ApplicationContext:在获取Spring对象上下文时会对Spring容器中的所有Bean对象进行加载初始化。

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

2)BeanFactory:只有在调用getBean方法时才会进行加载初始化对应的Bean对象,而不是所有的Bean对象。

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

3)两种方式区别:从继承功能方面和性能方面两个方面进行比较说明。

  1. 继承关系和功能方面:BeanFactory 提供了基础的访问容器的能力,而ApplicationContext是BeanFactory的子类,它除了继承了BeanFactory的所有功能之外,它还拥有独特的特性还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。
  2. 性能方面:ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个才去加载并初始化哪个,因此BeanFactory更加轻量,但效率不高。

3,获取Bean对象的三种方式?

1)通过名称获取:有缺陷,需要进行强制性转换,而强制类型转换容易出现空指针异常。

Student student = (Student) context.getBean("student");

2)通过类名获取:有缺陷,当同类型的Bean对象有多个时,抛出NoUniqueBeanDefinitionException异常(非唯一的Bean异常)。

Student student = context.getBean(Student.class);

3)通过名称+类名获取:推荐使用,规避了上述问题。

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

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

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

相关文章

UE特效案例 —— 魔法翅膀

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;PostProcessVolume设置曝光&#xff0c;设置Min/Max Brightness为1&#xff1b; 与关闭Game Sett…

【二分查找】35. 搜索插入位置

35. 搜索插入位置 解题思路 使用二分查找算法当找到元素之后直接返回位置即可当没找到元素&#xff0c;将该元素插入到left位置即可 class Solution {public int searchInsert(int[] nums, int target) {// 二分查找int left 0;int right nums.length - 1;while(left < …

数组扁平化flat方法的多种实现

flat() let arr [[1],[2, 3],[4, 5, 6, [7, 8, [9, 10, [11]]]],12 ];// 参数指要提取嵌套数组的结构深度&#xff0c;默认值为 1。 // Infinity 指递归嵌套的所有层级。 let flattedArr arr.flat(Infinity); console.log(flattedArr);执行效果&#xff1a; toString() 注意…

FreeRTOS ~(六)信号量 ~ (2/3)信号量解决互斥缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 举例子说明&#xff1a;利用信号量解决前述的"互斥的缺陷&…

SQL Server数据库 -- 表的高级查询

文章目录 一、子查询 嵌套子查询相关子查询二、查询运算 并运算union交运算intersect差运算except三、函数的使用 if语句while语句case语句四、总结 前言 高级子查询是对查询更灵活的运用&#xff0c;学会了高级查询将对数据库使用有很大的帮助。 一、子查询 1、子查询简介 在…

MATLAB画等深度构造图

clc;clear;close all; data xlsread(J_UNCONFORMITY等深度.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N 45…

天天刷题-->LeetCode(两数相加)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

MachineLearningWu_7+8_LogisticRegression/Classification

x.1 logistic regression 对于诸如分辨细胞是恶性肿瘤细胞与否的类似分类问题&#xff0c;我们使用Linear Regression的模型并不合适&#xff0c;所以引入Logistic Regression的模型&#xff0c;并绘制decision boundary&#xff0c;如下&#xff0c; Classification的最后一层…

mysql多表查询内连接,左外连接,排序,having

多表连接查询 use mydb3; -- 创建部门表 create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );– 创建员工表 create table if not exists emp3(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员…

python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

简介 大多数的初学者在使用 unittest 框架时候&#xff0c;不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚&#xff0c;不知道什么时候执行&#xff0c;什么时候不执行。虽然或许通过代码实现了&#xff0c;也是稀里糊涂的一知半解&#xff0c;这样还好&am…

基于深度学习的高精度Caltech行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度Caltech数据集行人检测识别系统可用于日常生活中或野外来检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv…

部署HAproxy + Nginx负载均衡集群

目录 一、常规Web集群调度器 HAproxy概念&#xff08;主要特性&#xff09; HAproxy负载均衡八种策略 二、LVS、Nginx、HAproxy区别 Nginx服务 LVS服务 HAproxy服务 三、部署HAproxy Nginx负载均衡集群 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 导…

基于paddelOCR的车票识别以及在PCB板上应用

基于paddelOCR的车票识别 任务简介 车牌识别就是从图片或者视频中提取车牌信息 任务难点 尺度差异大&#xff0c;悬挂位置不固定&#xff1b;角度倾斜&#xff0c;图片模糊&#xff0c;光照不足&#xff0c;过曝等问题&#xff1b;边缘和端测场景应用对模型大小有限制&#…

C++之装饰器适配器模式

目录 一、装饰器模式 模式思想 模式简介 模式优点 模式缺点 代码实现 情景模拟 代码实现 运行结果 二、适配器模式 模式简介 介绍 优点 缺点 代码实现 情景模拟 一、装饰器模式 模式思想 模式简介 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表&#xff0c;例如麦克风&#xff0c;摄像机&#xff0c;耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c…

伺服系统行业发展

伺服系统行业发展 1 介绍1.1 概述1.2 一般应用1.3 分类按系统功率分类按动力来源分类 1.4 工业控制中的伺服系统1.5 数字信号驱动与模拟信号驱动对比1.6 发展历史 2 伺服系统厂家工业机械臂移动AMR 3 关键指标及难点4 三相交流逆变器&#xff08;直流电转换为交流电&#xff09…

创建 Code Interpreter Demo: 一次实践的探索

好消息&#xff0c;好消息&#xff0c;Code Interpreter可以测试使用了&#xff01;&#xff01;&#xff01; 在这篇文章中&#xff0c;我们将探索如何创建一个 Code Interpreter Demo。提交一个2023年1-5月份的融资记录数据&#xff0c;让它来帮我们分析一下这些数据。 执行…

TCP 重传机制 滑动窗口 流量控制 拥塞控制 学习总结!

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 这篇博客主要记录 tcp 的基础知识的学习总结相关内容&#xff01;备注&#xff1a;图片均来自作者&#xff1a;小林哥 tcp 的三大特性 tcp 大家都不陌生&#xff0c…

Python制作gif表情包生成工具,斗图再也不会输啦

在当前无表情包不会聊天的时代&#xff0c;怎么也不能输在表情包数量不足上啊&#xff0c;今天咱们就来制作一个 gif 生成工具&#xff0c;用来制作表情包也太好用啦 先来看看整体效果 技术交流 技术要学会分享、交流&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人…