[maven]使用spring

news2024/12/18 22:59:00

    为了更好理解springboot,我们先通过学习spring了解其底层。

    这里讲一下简单的maven使用spring框架入门使用。因为这一块的东西很多都需要联合起来后才好去细讲,本篇通过spring-context大致地介绍相关内容。

    注意:spring只是一个框架,并不附属maven,只是maven作为市面上常见的项目构建工具,也会经常导入maven框架。因为学习上的规划,这里先使用maven快速上手spring。后续我会单独讲一下不使用maven的情况下使用spring的区别。

引入spring-context

    我们先使用IDEA创建一个maven项目,项目结构如下:

    要使用spring框架,首先要导入spring的jar包,maven坐标导入可以看我的另一篇文章,这里不再复述。找到maven简介-依赖管理

    spring的使用还需要我们创建一个配置spring的Bean相关数据的xml文件,这个文件的命名不锁死,为了便于理解我这里命名为Bean.xml。该配置文件我们创建在src.main.java.resources下面。

    我们看一下该配置文件的初始配置:

完整流程简单介绍

    这里先讲spring-context的简单使用,实例为通过spring的Bean来获取一个类的实例对象,做简单的入门介绍,细讲会放在后面。

    Bean的配置主要是通过一级标签<bean>来配置。

    这里给一个简单的<bean>标签使用案例。

    首先我们编写一个实体类User,将它创建在项目的java/entity包下,用来作为Bean类使用:

     然后我们在Bean.xml配置文件中给User类配置bean相关信息:

        其中,<bean>标签的属性class是选择托管给spring框架Bean工厂的类,而name是给该Bean类起的编号(别名)。name属性也可以换为id属性,两者的作用一样。当然,你也可以不使用name属性或者id属性,这样子你在调用该Bean获取对应的类对象时,你所填写的Bean名称便为属性class的值,这里后面文章会举例说明。

    而bean下的<property>是给该实例对象的属性赋值,该标签要求对应的属性必须创建对应的setter方法,否则name属性无法标记到该属性。比如我把前面实例里面User类的属性password的setter方法给注销掉,回到Bean.xml配置文件,我们会发现password的property报红,且后续找不到password属性,只能看到name属性:

    在编写好作为Bean的类和相关的配置信息后,我们可以通过Bean容器来获得该类的对象(获得Bean对象的方法有多种,这里以较为直接的方式先展示大致流程,后面会细讲)。

    首先通过我们所编写的配置文件Bean.xml来new一个容器,容器的类的类名为ClassPathXmlApplicationContext,通过该容器的getBean方法来获取我们的Bean类对象。

    我们先看getBean方法:

    可以 看到,该方法返回的是一个Object类对象,也就是超类对象。而我们所写的User类毫无疑问是Object的子类,所以我们在使用该方法获取Bean类对象时,要使用强制类型转换。

    接着我们编写测试类,通过断点查看我们获取对象的情况。以下是编写的测试类:

     然后我们进行调试,可以看到调试台的相关信息:

    以上就是一个较为完整的spring-context上下文管理Bean管理的具体使用流程。现在我们总结一下这个过程的步骤:

    首先我们确定需要通过Bean来管理的类,上面的案例中我们是直接创建。

    然后我们需要给该类在容器的配置文件Bean.xml配置相关信息,案例中只做了简单的直接获取和属性赋值。

    最后我们在需要获取类对象的地方通过容器的getBean方法来获取对应的类对象。

    接下来我们就细讲这三个步骤。

Spring Bean工厂和IOC容器

    最初提到为了解耦模式里面的工厂,在spring里是接口BeanFactory。在案例里面打开ClassPathXmlApplicationContext的继承图,可以看到其源继承自BeanFacory。

    spring容器是spring框架的核心。配置好相关参数之后 (比如案例里的Bean.xml文件) ,配置好容器之后,容器会把这些类连接在一起,管理这些类的实例对象的整个生命周期 (从创建到销毁)。

    spring容器的管理方式叫做依赖注入(简称DI),这是一种设计模式。这种设计模式用于在一个对象(被注入方)中,设置其所依赖的其他对象(被依赖方)的过程。在 Spring 中的体现是指,对象之间的依赖关系由Spring 容器来负责注入,而不是由对象自身来创建或获取它所依赖的对象。

    这个spring容器,也就是一种IOC容器。控制反转(简称IOC),意为将对象的控制管理从程序代码中转移到一个容器里面,不再由程序员自己在程序中new出来。而依赖注入是实现控制反转的具体方式。

    spring提供了两种不同的容器:

1.spring BeanFactory

2.spring ApplicationContext

    刚刚已经讲了简单的工厂配置文件Bean.xml的使用,接下来我们细讲这两种不同的容器。

spring BeanFacory

    我们前面的简单案例中就已经提到了BeanFactory工厂。

    这里的工厂模式流程简述为:

1.导入spring的jar包

2.配置Bean的xml配置文件。这一步就接上我们前面案例中的第一步和第二步。

3.在需要的地方找工厂要Bean对象。

    其中,前面两步都比较简单且在前面已经讲过,有差别的地方在第三步,这里我们直接来到第三步的代码编写:

    然后我们一步一步讲。

    首先是BeanFactory工厂对象的创建,BeanFactory是一个接口,我们想要创建它的实例是不可能的,所以我们要去找BeanFactory的实现类。 这里不展开讲IDEA的使用,我们使用BeanFactory的实现类:DefaultListableBeanFactory。

    而XmlBeanDefinitionReader是专门解读Bean的xml配置文件的一个Reader类,该Reader类的使用方式为:以创建的BeanFactory对象作为参数,传入其构造函数创建一个Reader类实例对象,然后调用该Reader类的load方法加载我们的Bean的xml配置文件。

    我们前面案例中的ClassPathXmlApplicationContext和这里使用的DefaultListableBeanFactory,都是BeanFactory的实现类

    控制反转IOC的思想就是,将创建对象的这个控制权力交给一个容器,在这里这个容器就是spring框架,而后我们开发人员不再不再主动new类的实例对象。

spring ApplicationContext

    前面BeanFactory我们讲了,通过容器,我们开发人员不再主动new实例对象。但上面的工厂模式里面,我们还是需要调用getBean方法来获取实例对象,实际上和new实例对象这一步...感觉也没太大区别?我想要我可以直接通过属性调这类的对象就行,都不用我去创建。这里就可以使用依赖注入的思想了。

    假设想直接调用属性的是否还记得在前面的案例里面,我们使用了Bean.xml配置文件给我们的User类实例对象的属性:name和password都附了值。这个User类就既是被注入方(它的实例对象被spring容器注入赋值了name和password),也是被依赖方(被测试类所依赖)。

    我们编写一个service层的实现类Login,通过依赖注入完成对entity类User的调用:

    service实现类:

    配置Bean.xml配置文件,添加Login类的依赖注入 

     在这里需要注意一下,给属性赋简单的值使用value就可以直接赋值了,但如果赋值内容是一个对象(依赖注入我们Bean配置文件中配置好的其他Bean类实例对象),那么需要我们使用ref属性而不是value属性。而且,对于Login类被注入的属性user,我们也需要给它创建一个setter方法。

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

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

相关文章

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中&#xff0c;UI是不可缺少的模块&#xff0c;而在UI中又使用着大量的图片&#xff0c;特别是2D游戏还有很多精灵图片存在&#xff0c;如果不加以处理&#xff0c;会导致很高的Batches&#xff0c;影响性能。 比如如下的例子&#xff1a; Batches是9&#xff0…

transformer学习笔记-位置编码

在transformer学习笔记-自注意力机制&#xff08;1&#xff09;学习原理的时候&#xff0c;我们提到: 将句子从“苹果梨”&#xff0c;改成“梨苹果”&#xff0c;最终的到的新苹果和新梨&#xff0c;竟然是一样的&#xff0c;因为苹果和梨两个向量调换顺序后&#xff0c;对应计…

【Unity3D】实现UGUI高亮引导点击

Unity版本2019.4.0f1 Personal <DX11> using UnityEngine; using UnityEngine.UI;public class GuideMask : MonoBehaviour, ICanvasRaycastFilter {public Canvas canvas;public Transform guideTargetTrans;public Image image;private Vector3 guideTargetWorldPos;pr…

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色&#xff0c;它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置&#xff0c;取代了早期版本中依赖的XML配置文件。 集中化管理&#xff1a;借助Configuration注解&#xff0c;Spring Boot让用户能在一个或几个配…

SpringBoot增删改查导入导出操作【模板】

SpringBoot增删改查导入导出操作【模板】 文章目录 SpringBoot增删改查导入导出操作【模板】前期数据库操作IDEA上进行操作1. 创建 Spring Boot 项目2. 项目结构3. pom.xml文件4. 配置数据库连接并进行测试5. 创建实体类6. 创建 MyBatis Mapper7. 创建服务层8. 创建控制器9. 启…

mfc140.dll是什么东西?mfc140.dll缺失的几种具体解决方法

mfc140.dll是Microsoft Foundation Classes&#xff08;MFC&#xff09;库中的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是微软基础类库的一部分&#xff0c;为Windows应用程序的开发提供了丰富的类库和接口。MFC库旨在简化Windows应用程序的开发过程&…

探索Starship:一款用Rust打造的高性能终端

在终端的世界里&#xff0c;效率和美观往往并行不悖。今天&#xff0c;我们要介绍的是一款名为Starship的终端工具&#xff0c;它以其轻量级、高颜值和强大的自定义功能&#xff0c;赢得了众多开发者的青睐。 安装 任选一种方式进行安装 Windows &#x1fa9f; # scoop scoo…

2024年NSSCTF秋季招新赛-WEB

The Beginning F12看源码&#xff0c;有flag http标头 黑吗喽 题目说要在发售时的0点0分&#xff0c;所以添加标头data Date: Tue, 20 Aug 2024 00:00:00 GMT然后改浏览器头 User-Agent: BlackMonkey曲奇就是Cookie cookieBlackMonkey这个一般就是Referer Referer:wukon…

TQ15EG开发板教程:使用SSH登录petalinux

本例程在上一章“创建运行petalinux2019.1”基础上进行&#xff0c;本例程将实现使用SSH登录petalinux。 将上一章生成的BOOT.BIN与imag.ub文件放入到SD卡中启动。给开发板插入电源与串口&#xff0c;注意串口插入后会识别出两个串口号&#xff0c;都需要打开&#xff0c;查看串…

windos系统安装-mysql 5.7 zip压缩包教程

一, 安装包下载 在mysql官网上下载mysql5.7版本的压缩包 官方网址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads选择历史版本 选择系统和数据库版本下载 下载完成后解压到安装的目录 二, 新增数据目录,配置文件, 配置环境变量 新建data文件夹用于存放数据库…

js 获取屏幕高度和宽度的几种方式

1、document.documentElement.clientHeight 屏幕可视区域高度&#xff0c;文档的根元素&#xff08;通常是 <html> 元素&#xff09;的高度&#xff0c;但会受到CSS样式的影响。 实际应用&#xff1a;对于H5的移动端&#xff0c;希望video元素在全屏状态下占满整个手机屏…

Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection

论文地址&#xff1a;Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection - ACL Anthologyhttps://aclanthology.org/2024.acl-long.49/ 1. 概述 立场检测被定义为对文本中立场态度的自动推断。根据 Biber 和 Finegan (1988) 的定义&#xff0c;立场包含两个主…

css基础-认识css

什么是css css是一个样式表&#xff0c;是对html的一种装饰&#xff0c;它决定了浏览器如何显示html元素&#xff0c;例如&#xff1a; h1 {color:blue; //文字颜色是蓝色font-size:12px; //字体大小为12像素 }上段css代码就是对HTML 中 <h1>标签的修饰&#xff1b;所以…

【Unity功能集】TextureShop纹理工坊(二)图层(下)

项目源码&#xff1a;后期发布 索引 图层渲染绘画区域图层Shader 编辑器编辑模式新建图层设置当前图层上、下移动图层删除图层图层快照 图层 在PS中&#xff0c;图层的概念贯穿始终&#xff08;了解PS图层&#xff09;&#xff0c;他可以称作PS最基础也是最强大的特性之一。 …

云计算HCIP-OpenStack02

书接上回&#xff1a; 云计算HCIP-OpenStack01-CSDN博客 7.OpenStack核心服务 7.1Horizon&#xff1a;界面管理服务 Horizon提供了OpenStack中基于web界面的管理控制页面&#xff0c;用户或者是管理员都需要通过该服务进行OpenStack的访问和控制 界面管理服务需要依赖于keyston…

Word2Vec:将词汇转化为向量的技术

文章目录 Word2Vec来龙去脉分层Softmax负采样 Word2Vec 下面的文章纯属笔记&#xff0c;看完后不会有任何收获&#xff0c;如果想理解这两种优化技术&#xff0c;给大家推荐一篇博客&#xff0c;讲的很好&#xff1a; 详解-----分层Softmax与负采样 来龙去脉 word2vec,即将词…

电商商品详情API接口(item get)数据分析上货

电商商品详情API接口&#xff08;item get&#xff09;在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨&#xff1a; 一、数据分析 数据源获取&#xff1a; 商品详情API接口提供了丰富的数据源&#xff0c;包括商品的标题、价格、库存、描述、图片、用…

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch

作者&#xff1a;来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的&#xff0c;因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…

如何对 Java 项目简化接口设计提升开发效率

文章目录 摘要引言简洁接口设计的原则示例代码OrderProcessor 接口StandardOrderProcessor 实现类Order 数据类调用方代码&#xff1a;OrderService 模块之间的协作QA 环节总结参考资料 摘要 简洁的接口设计可以有效降低代码依赖与耦合度&#xff0c;提高代码的可维护性和扩展…

Python字符串及正则表达式(十):字符串常用操作、字符串编码转换

前言&#xff1a;在编程的世界里&#xff0c;字符串无处不在。它们是构建用户界面、存储数据、进行通信的基础元素。无论是财务系统的总账报表、电子游戏的比赛结果&#xff0c;还是火车站的列车时刻表&#xff0c;这些信息最终都需要以文本的形式呈现给用户。这些文本的背后&a…