[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方法。

相关推荐
小河vlog3 分钟前
.NET 8 获取CPU序列号和主板序列号异常问题
java·服务器·.net
yuanManGan5 分钟前
数据结构漫游记:初识vector
java·开发语言·数据结构
Nijika...16 分钟前
libilibi项目总结(17)Elasticsearch 的使用
java·后端·spring·elasticsearch
恩爸编程19 分钟前
探秘 Maven 依赖范围:你的项目“魔法圈”
java·maven·maven开发·maven多模块开发·maven依赖范围·maven依赖范围概念·maven依赖范围使用
shine_du39 分钟前
架构师之路--springboot核心类SpringApplication方法run的源码启动流程
java·spring boot·后端
毒丐41 分钟前
VirtualBox使用教程
java·服务器·c++
Easy_Company1 小时前
Hadoop实验:关于MapReduce词频统计的实验步骤
java·大数据·hadoop·mapreduce
数据小爬虫@1 小时前
如何利用Java爬虫获得淘宝买家秀
java·开发语言·爬虫
waicsdn_haha1 小时前
MySql-9.1.0安装详细教程(保姆级)
java·数据库·后端·mysql·php·性能测试·数据库开发
只会写bug的靓仔1 小时前
无管理员权限 LCU auth-token、port 获取(全网首发 go)
开发语言·后端·golang