(我就是个封面)

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配置最佳实践之一

转载于:https://www.cnblogs.com/qiaobing/p/10985748.html

Spring-boot原理(附带实现一个spring-boot-starter实例和代码下载)相关推荐

  1. Spring学习笔记:第一个Spring Boot程序HelloWorld

    Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...

  2. spring boot:从零开始搭建一个项目 - day 5 Mybatis plus代码自动生成器

    spring boot:从零开始搭建一个项目 - day 5 Mybatis plus代码自动生成器 一.Mybatis plus代码自动生成器 1.引入配置 2.创建Controller 3.执行m ...

  3. 使用 Spring Boot CLI 运行第一个Spring boot程序

    简介 Spring Boot CLI是Spring Boot的命令行界面.它可以用来快速启动Spring.  它可以运行Groovy脚本.  Spring Boot CLI是创建基于Spring的应用 ...

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

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

  5. c 数组上限_高级I/O复用技术:Epoll的使用及一个完整的C实例含代码

    高性能的网络服务器需要同时并发处理大量的客户端,而采用以前的那种对每个连接使用一个分开的线程或进程方法效率不高,因为处理大量客户端的时候,资源的使用及进程上下文的切换将会影响服务器的性能.一个可替代的 ...

  6. 创建并运行一个 Spring Boot 项目

    创建并运行一个 Spring Boot 项目 引言 第一个 Spring Boot 项目 1. 创建一个 spring boot 项目 第一步 第二步 第三步 第四步 2. 验证 第一步 第二步 3. ...

  7. Spring MVC原理及配置详解

    转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...

  8. Spring 事务原理和使用

    转载自  Spring 事务原理和使用 1.Spring@Transactional的配置 步骤一.在Spring配置文件中引入命名空间 <beans xmlns="http://ww ...

  9. 【Spring】Spring MVC原理及配置详解

    [Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...

  10. 【Mybatis+spring整合源码探秘】--- mybatis整合spring事务原理

    文章目录 1 mybatis整合spring事务原理 1 mybatis整合spring事务原理 本篇文章不再对源码进行具体的解读了,仅仅做了下面一张图: 该图整理了spring+mybatis整合后 ...

最新文章

  1. Quartz2D绘图
  2. WPF and Silverlight 学习笔记(十):WPF控件模型
  3. UITableView取消选中颜色、常用操作
  4. 宋君强 学科评估 计算机科学,三分钟,这个学院带你乘风破浪
  5. Linux数据报文接收发送总结3
  6. select语句for update---转载
  7. ASP.NET网站实现多语言版本 【转】
  8. 分布与并行计算—并行计算π(Java)
  9. java日历类add方法_Java日历computeFields()方法及示例
  10. JavaScript 中的垃圾回收和内存泄露如何处理?| 技术头条
  11. Linux Shell编程(2)——第一个shell程序
  12. MyEclipse搭建安卓环境
  13. 用ASP.NET开发胖客户端应用程序
  14. Oracle 视图、序列、索引、游标、触发器、事务
  15. 基于Java保险员工管理系统的设计与实现
  16. 3.33 利用快速蒙版制作选区 [原创Ps教程]
  17. 国内主流云厂商下一代云主机最大可售卖384核
  18. python内置库求复数的辐角_皮肤与美容—医学专家如是说_中国大学MOOC(慕课)_章节测验答案...
  19. passive-interface的含义
  20. Downloader——Linux中的下载利器

热门文章

  1. 全网首发:sqlite-jdbc在UOS上弹窗提示的解决办法
  2. jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
  3. 路灯干扰者路过时,路灯熄灭的照片
  4. 全网首发:OPPO推送:服务器端的参考代码,JAVA版
  5. 广义相对论场方程的发现是必然的
  6. 摄像头实时帧率_【每日新闻】思特威全新发布130W像素全局快门图像传感器SC133GS;三星Galaxy Z Flip或仅配备12MP后置摄像头...
  7. linux centos git 自动更新,在centos上搭建git服务器并自动同步代码
  8. 100阶乘c语言如何实现,求10000的阶乘(c语言代码实现)
  9. abaqus失效单元删除_abaqus删除失效单元
  10. web的标准网页设计与php课后,第3章web标准与html