当前位置: 首页 > article >正文

[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.kler.cn/a/441340.html

相关文章:

  • 分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法
  • SFTP 使用方法
  • 多模态论文笔记——TECO
  • 进程间通信
  • (详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.2 ndarray解剖课:多维数组的底层实现
  • Docker--Docker Registry(镜像仓库)
  • [Unity Shader] 【游戏开发】Unity Shader的结构2-深入理解 SubShader 的结构与应用
  • 【C 语言文件操作】—— 内存映射与高效 I/O 策略的深度融合
  • LabVIEW 保存文件
  • SpringBoot实现定时发送邮件功能
  • 【GoF23种设计模式】02_单例模式(Singleton Pattern)
  • 复原IP地址 什么是运算符重载? 如何在 C++ 中进行运算符重载?运算符重载在面向对象编程中的好处是什么?getline方法
  • 爬虫基础学习
  • 同轴共桨单兵微型无人机技术详解
  • 机器学习-多元线性回归
  • C# 入门编程
  • 使用C#获取有关磁盘驱动器的信息例如大小和可用空间
  • V少JS基础班之第二弹
  • 【基础】nginx简单配置
  • leetcode--mysql
  • HTMLCSS:3D卡片翻转悬停效果
  • 运维报错:SALV报错 CX_SALV_OBJECT_NOT_FOUND
  • PHP8.4下webman直接使用topthink/think-orm
  • 12.17双向链表,循环链表
  • LeetCode - #163 缺失的区间(会员题)