欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring-boot原理及spring-boot-starter实例和代码

程序员文章站 2024-02-16 15:56:46
spring-boot自出现后,到现在火的很,大家貌似都在用,连招聘里面也要求会这个。但是说实话,spring-boot无外乎想实现一种可插拔的编程方式,说是简化配置,...

Spring-boot原理及spring-boot-starter实例和代码

spring-boot自出现后,到现在火的很,大家貌似都在用,连招聘里面也要求会这个。但是说实话,spring-boot无外乎想实现一种可插拔的编程方式,说是简化配置,其实并没有减少多少,只不过把配置落到代码里面,通过各种annotation来标示了。

作为个人其实不太愿意团队用spring-boot这种层层封装的方式,各种jar铺天盖地,最终大家都被绑架了,自己底层的能力不一定有什么提高。

spring-boot的starter又是个什么鬼?

一句话,spring-boot的starter是一个通过maven完成自包含并通过annotation配置使得可被spring上下文发现并实例化的一个可插拔的组件或服务。

spring-boot有两种starter

一种是内部已经支持的,一种是第三方的。

内部支持starter:

其通过@conditionalonclass来实决定是否例化(conditionalonclass是指当在classpath发现需要的依赖的类时实例化),想要启动这个服务,只要要配置上对应的starter,这个starter就能把所需要的jar给关联上。

类似于我们对log的使用,默认使用slf4j这个api接口,提供一个钩子,classpath里面谁实现了这个机构,谁就挂到这个钩子上成为log具体实现,其中log4j就是一个实现。

通过spring的如下maven配置即可看见里面已经通过dependencymanagement(这个时maven的依赖管理,不用的时候不会加载)给你配置好了所有内置starter。只需要用的时候把对应的starter依赖配置上就行了。

<dependency>
jpg <groupid>org.springframework.boot</groupid>
jpg <artifactid>spring-boot-starter</artifactid> <
jpg/dependency>

所有的starter其实都是要通过代码配置被上下文发现的,可以在spring-boot-autoconfigure-xxx.jar去看,如下:。

Spring-boot原理及spring-boot-starter实例和代码

内置的tomcat,jetty也在里面:​

Spring-boot原理及spring-boot-starter实例和代码

具体代码:

通过conditionalonclass只要发现了tomcat这个类(配置了spring-boot-starter-web的maven依赖后就会会有),就会启动tomcat的服务。

Spring-boot原理及spring-boot-starter实例和代码

第三方starter:

比如mybatis等。

原理是一样的,就是在你已经实现的服务代码之上封装一层配置代码就行,看看mybitis的,这是mybatis-spring-boot-starter的依赖。

<dependency>
jpg<groupid>org.mybatis.spring.boot</groupid>
jpg<artifactid>mybatis-spring-boot-starter</artifactid>
jpg<version>1.3.0</version>
jpg</dependency>

这个依赖是一个pom,点进去可以看见自包含的依赖关系,其中一个就是mybatis的autoconfigure,通过@bean等annotation完成对mybatis的实例化配置,如下:

Spring-boot原理及spring-boot-starter实例和代码

具体代码:

Spring-boot原理及spring-boot-starter实例和代码

基于这个机制,我们自己也可以实现一个

本次实现一个简单的数据库操作组件,类似于mybatis,只不过只实现了简单的查询服务。

整个示例有两个工程:

一个实现我们自己的starter(取名叫spring-boot-mydao-starter),最后会打成ar包,并install到本地maven本地厂库里。

另外一个工程用于测试,最终会依赖spring-boot-mydao-starter整个组件,并调用里面的查询服务去测试。​

Spring-boot原理及spring-boot-starter实例和代码

工程

具体类如下:

1、创建spring-boot-mydao-starter工程,添加相关依赖配置

我们实现的这个组件仅仅依赖于mysql的驱动以及spring-boot的上下文环境。其中mysql驱动用的spring-boot-starter-parent里面配置好的,这里直接用即可,maven配置如下:

Spring-boot原理及spring-boot-starter实例和代码

2、实现以下几个类:

mydao:封装数据库的连接和查询服务,和spring没有任何关系。

mydaoautoconfiguration:提供mydao的配置用于启动时被spring上下文发现并解析。

dbproperties:完成对数据库配置参数文件的读取(db.properties,当然spring-boot也支持其他格式的配置文件,个人还是喜欢传统样式)。

其中mydao:

Spring-boot原理及spring-boot-starter实例和代码

mydaoautoconfiguration(将配置参数对象传给mydao并配置mydao实例):

spring在启动时会通过@bean实例化mydao并将其放入configurableapplicationcontext容器中。

Spring-boot原理及spring-boot-starter实例和代码

配置文件类dbproperties:

自动读取classpath下的db.properties的配置文件,并实例化成类对象。配置文件需要在测试的工程(test-spring-boot-mydao-starter)里提供。

Spring-boot原理及spring-boot-starter实例和代码

配置文件db.properties

Spring-boot原理及spring-boot-starter实例和代码

以上就是真个starter的类容。下面描述如何使用这个starter。

新建测试工程test-spring-boot-mydao-starter(起啥名都行)。配置上对我们的starter的依赖:

因为starter里面已经依赖了spring-boot的上下文,所以这里就不用配置了。

Spring-boot原理及spring-boot-starter实例和代码

然后就是测试:

我们用mysql自带的数据库里面的user表做测试。以下是测试类,需要注入starter里面的mydao:

Spring-boot原理及spring-boot-starter实例和代码

然后就是启动测试:

Spring-boot原理及spring-boot-starter实例和代码

也可以用spring的junit来测试。

总结

以上所述是小编给大家介绍的spring-boot原理及spring-boot-starter实例和代码,希望对大家有所帮助