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
去看,如下:。
内置的tomcat,jetty也在里面:
具体代码:
通过conditionalonclass
只要发现了tomcat这个类(配置了spring-boot-starter-web的maven依赖后就会会有),就会启动tomcat的服务。
第三方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的实例化配置,如下:
具体代码:
基于这个机制,我们自己也可以实现一个
本次实现一个简单的数据库操作组件,类似于mybatis,只不过只实现了简单的查询服务。
整个示例有两个工程:
一个实现我们自己的starter(取名叫spring-boot-mydao-starter),最后会打成ar包,并install到本地maven本地厂库里。
另外一个工程用于测试,最终会依赖spring-boot-mydao-starter整个组件,并调用里面的查询服务去测试。
工程
具体类如下:
1、创建spring-boot-mydao-starter工程,添加相关依赖配置
我们实现的这个组件仅仅依赖于mysql的驱动以及spring-boot的上下文环境。其中mysql驱动用的spring-boot-starter-parent里面配置好的,这里直接用即可,maven配置如下:
2、实现以下几个类:
mydao:封装数据库的连接和查询服务,和spring没有任何关系。
mydaoautoconfiguration:提供mydao的配置用于启动时被spring上下文发现并解析。
dbproperties:完成对数据库配置参数文件的读取(db.properties,当然spring-boot也支持其他格式的配置文件,个人还是喜欢传统样式)。
其中mydao:
mydaoautoconfiguration(将配置参数对象传给mydao并配置mydao实例):
spring在启动时会通过@bean实例化mydao并将其放入configurableapplicationcontext容器中。
配置文件类dbproperties:
自动读取classpath下的db.properties的配置文件,并实例化成类对象。配置文件需要在测试的工程(test-spring-boot-mydao-starter)里提供。
配置文件db.properties
以上就是真个starter的类容。下面描述如何使用这个starter。
新建测试工程test-spring-boot-mydao-starter
(起啥名都行)。配置上对我们的starter的依赖:
因为starter里面已经依赖了spring-boot的上下文,所以这里就不用配置了。
然后就是测试:
我们用mysql自带的数据库里面的user表做测试。以下是测试类,需要注入starter里面的mydao:
然后就是启动测试:
也可以用spring的junit来测试。
总结
以上所述是小编给大家介绍的spring-boot原理及spring-boot-starter实例和代码,希望对大家有所帮助