[maven]使用spring

    为了更好理解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.mzph.cn/diannao/64274.shtml

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

相关文章

eBay如何养号?新手养号宝典

​ebay是热门的跨境电商平台之一&#xff0c;然而与其他跨境电商平台不同&#xff0c;不同等级的ebay账户可刊登的数量是不同的。对于新手来说&#xff0c;想要提升ebay账户的等级就需要养号。那ebay如何养号&#xff1f;本文将带来一些实用的养号策略&#xff0c;帮助新手快速…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象表达03

目录 1、举例(四)&#xff1a;五子棋 【五子棋】 的分析步骤 2、讨论&#xff1a; 模型与代码 1、举例(四)&#xff1a;五子棋 【五子棋】 的分析步骤 Step-1: 找到主角— 棋手&#xff0c;很容易发现核心的概念了&#xff0c;例如&#xff1a;五子棋游戏的主角是棋手(玩家…

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

YOLOv5-7.0训练过程中出现报错Example: export GIT_PYTHON_REFRESH=quiet

出现报错&#xff1a; This initial message can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silence|s|silent|none|n|0: for no message or exception - warn…

KALI安装操作及过程

以下是在计算机上安装 Kali Linux 的详细教程&#xff1a;&#xff08;通常我直接使用虚拟机&#xff09; 解压虚拟机安装包&#xff0c;直接在虚拟机中打开KALI &#xff08;将内存改为4GB&#xff09; 初始密码账号&#xff1a;kali 一、准备工作 下载 Kali Linux 镜像文件…

Linux环境安装Jenkins

Linux环境安装Jenkins Jenkins和JDK的版本 Jenkins和JDK的版本需要对应&#xff0c;不然无法正常启动。 Jenkins稳定版下载地址 Jenkins服务 手动使用命令启动和关闭Jenkins比较麻烦&#xff0c;所以可以把Jenkins设置成开机启动。 创建Jenkins.sh文件 JAVA_HOME和jenk…

ComfyUI 与 Stable Diffusion WebUI 的优缺点比较

ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品&#xff0c;两者存在诸多差异&#xff0c;本篇就带你熟悉二者的优劣&#xff0c;方便自己做出决策。 界面与操作 ComfyUI&#xff1a;界面简洁直观&#xff0c;通过节点和连线的方式构建工作流&#xff0c;用…

2024年第十五届蓝桥杯青少组C++国赛—割点

割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成&#xff0c;每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置&#xff0c;如果要使棋盘上出现两个及以上的棋子连通块&#xff0c;请问…

uni-app Android平台上架要求的隐私政策提示配置方法【跨端开发系列】

文章目录 前言&#x1f4d6;一、前言二、DCloud 数据采集说明三、配置方式3.1 HBuilderX3.2.1及以上版本配置方式3.2 HBuilderX3.2.0及以下版本配置方法3.3 模板提示框3.4 无提示框 四、离线打包配置方式五、模板提示框六、二次确认提示框七、国际化八、隐私协议内容需要注意的…

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到&#xff1a;0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束&#xff0c;训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势&#xff0c;包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构&#xff0c;主要依赖于控制流&#xff0c;其中上下文信息是嘈杂的&#xff0c;并且可能受到编译器优化的影响。为了解…

手搓一个极简远端git库

原文地址&#xff1a;手搓一个极简远端git库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 问题分析 公司一直用 gitlab &#xff08;或者 极狐 都是一样的&#xff09;作为代码管理库&#xff0c;但是看了一些文章说代码最小的管理只需要 g…

Linux 服务器下非root用户安装CUDA完整流程(多次踩雷经验总结)

参考博客&#xff1a; linux下安装cuda和cudnn&#xff08;非root权限&#xff09;_cuda下载安装 远程服务器 linux-CSDN博客 Linux下非root用户安装CUDA_linux下cuda-toolkit-archive-CSDN博客 非root用户安装cuda10.1&#xff0c;以及CUDA不同版本间切换_非root用户.run文…

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现二叉排序树的基本算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;二叉树的创建、查找和删除算法。具体如下&#xff1a; (1)由…