(我就是个封面)

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>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId> <

/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>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.0</version>

</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来测试。

~以上便是本次分享所有内容~

源码下载

为防止地址失效,所有下载链接都在公众号维护,请关注公众号后,回复“R003” 获取完整源码。

扩展阅读:模块化编程及Maven配置最佳实践之一

Spring-boot原理(附带实现一个spring-boot-starter实例和代码下载)的更多相关文章

  1. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)

    使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...

  2. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  3. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)

    梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...

  4. Spring Boot (1) 构建第一个Spring Boot工程

    Spring boot简介 spring boot是spring官方推出的一个全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程. Spring boot特点 1.化繁为简,简化配 ...

  5. 从零开始的Spring Boot(1、搭建一个Spring Boot项目Hello World)

    搭建一个Spring Boot项目Hello World 写在前面 从零开始的Spring Boot(2.在Spring Boot中整合Servlet.Filter.Listener的方式):http ...

  6. Spring事务原理分析--手写Spring事务

    一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己 ...

  7. Spring框架学习-搭建第一个Spring项目

    步骤一:下载Spring开发包. 官网:https://spring.io/           下载地址:https://repo.spring.io/libs-release-local/org/ ...

  8. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  9. Spring MVC原理及配置

    Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...

随机推荐

  1. hdu-5792 World is Exploding(容斥+树状数组)

    题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Jav ...

  2. 用OpenLayers开发地图应用

    项目背景 最近有一个使用全球地图展示数据的项目,用地图展示数据本身没什么难度,但出于安全和保密的考虑,甲方单位要求项目不能连接外网,只能在内网使用,也就是说,我们不得不在内网中部署一个地图服务器,在这 ...

  3. Redis实现求交集操作结果缓存的设计方案

    Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...

  4. Jasper-template

    ylbtech-Jasper: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech. ...

  5. maven学习八 关于maven的version

      在一个有继承关系的POM文件中,父项目中有如下定义: <dependencyManagement> <dependency> <groupId>com.type ...

  6. C# FileStream Write追加写入文本

    该例子为追加 C盘中的 file1.txt 的文本内容 完整代码如下: 引入命名空间: [csharp] view plain copy print? using System.IO; 完整代码: [ ...

  7. deleteMany is not a function

    问题: 同事使用了deleteMany方法用于删除数据,但是全公司只有我一个人报错deleteMany is not a function. 很自然,输出了model.deleteMany,得到的结果 ...

  8. Adding In-App Purchase to your iOS and OS X Applications

    Adding In-App Purchase to your iOS and OS X Applications In-App Purchase allows you to sell addition ...

  9. 细说 CSS margin

    作者:https://coding.net/u/zhengkenghong原文:https://blog.coding.net/blog/css-margin 细说 CSS margin 本文着重描述 ...

  10. Regex Golf 练习记录

    正则表达式的练习网站:https://alf.nu/RegexGolf 共17道题:只能说从第10题开始就很变态了,就是看看答案好了 .Warmup: foo .Anchors: k$ 或 ick$ ...