我们在使用SpringBoot 项目时,引入一个springboot start依赖,只需要很少的代码,或者不用任何代码就能直接使用默认配置,再也不用那些繁琐的配置了,感觉特别神奇。我们自己也动手写一个start.

一、新建一个 Start 的 Maven 项目

  1. pom 文件如下
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version><optional>true</optional><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
  • spring-boot-autoconfigure springboot 自动配置的核心依赖
  • spring-boot-starter-test 测试包
  • lombok 省去 getter/setter 等简化代码
  1. 演示代码

DemoService:

public interface DemoService {String getMessage();Integer getCode();
}复制代码

DemoServiceImpl:

public class DemoServiceImpl implements DemoService {@Overridepublic String getMessage() {return "Hello!";}@Overridepublic Integer getCode() {return 123;}
}
复制代码

DemoAutoConfiguration:

@Configuration
public class DemoAutoConfiguration {@Bean@ConditionalOnMissingBean(DemoService.class)public DemoService demoService() {return new DemoServiceImpl();}
}
复制代码
  • @Configuration 标注该类为一个配置类
  • ConditionalOnMissingBean(DemoService.class) 条件注解

spingboot 的自动注解主要还是用这些条件注解来实现的。请查看之前的文章:

Spring Boot 自动配置之条件注解

Spring Boot 自动配置之@Enable*与@Import注解

Spring Boot 自动配置之@EnableAutoConfiguration

  1. 让springboot 识别自动自动配置的代码

需要在resources下新建文件META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jiuxian.DemoAutoConfiguration
复制代码

SpringBoot 中的注解 @EnableAutoConfiguration 在项目启动的时候会通过 SpringFactoriesLoader.loadFactoryNames 方法获取 spring.factories 文件下的配置类

  1. 测试类
  • 首先需要再包下建 Application run 的main 方法
@SpringBootApplication
public class StartDemoApplication {public static void main(String[] args) {SpringApplication.run(StartDemoApplication.class, args);}
}复制代码
  • 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class StartDemoApplicationTests {@Resourceprivate DemoService demoService;@Testpublic void test() {String message = demoService.getMessage();System.out.println(message);Assert.assertEquals("Hello!", message);Integer code = demoService.getCode();System.out.println(code);Assert.assertEquals(123, (int) code);}
}
复制代码

如果没有 StartDemoApplication 这个类则测试类启动的时候会报 @SpringBootApplication 找不到错误

二、新建 springboot 项目引入刚写的start项目

  1. service
@Service
public class TestService {@Resourceprivate DemoService demoService;public void message() {System.out.println("code:" + demoService.getCode());System.out.println("message:" + demoService.getMessage());}
}复制代码
  1. 测试
    @Resourceprivate TestService testService;@Testpublic void test() {testService.message();}复制代码

结果:

code:123
message:Hello!
复制代码
  1. 重写DemoService方法
@Service
public class DemoServiceImpl implements DemoService {@Overridepublic String getMessage() {return "Hello!";}@Overridepublic Integer getCode() {return 123;}
}复制代码
  1. 测试结果
code:123
message:Hello!
复制代码

之所以这样的结果,是因为在start项目中的DemoService 实现类中有一个 @ConditionalOnMissingBean(DemoService.class) 的注解,如果不存在则使用默认的

三、Demo 源码

GitHub源码地址

Spring Boot 动手写一个 Start相关推荐

  1. 自己动手写一个简单的bootloader

    自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...

  2. 自己动手写一个分库分表中间件(三)数据源路由实现

    相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...

  3. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  4. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  5. 自己动手写一个印钞机 第四章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  6. 自己动手写一个nodejs的日志生成器

    自己动手写一个nodejs的logger 最近正在边学边用node.js开发个人应用的server,由于有用到websocket相关,想对websocket的通信选择性的做下日志记录,所以萌发了自己动 ...

  7. 自己动手写一个印钞机 第二章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  8. 学习较底层编程:动手写一个C语言编译器

    动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可 ...

  9. 自己动手写一个 strace

    这次主要分享一下一个动手的东西,就是自己动手写一个 strace 工具. 用过 strace 的同学都知道,strace 是用来跟踪进程调用的 系统调用,还可以统计进程对 系统调用 的统计等.stra ...

最新文章

  1. mongodb权限管理
  2. 黑客攻击我们的11步详解及防御建议
  3. python写电脑程序_【初学者教程】在电脑上安装Python,写第一个程序
  4. C++中的继承与虚函数各种概念
  5. java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题
  6. php中英文版切换最好的办法,php做项目进行中英文的切换,如何快速实现
  7. LeetCode(806)——写字符串需要的行数(JavaScript)
  8. 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
  9. C#SuperSocket服务器的简易实现
  10. hp RAID卡 命令行管理
  11. Geolocation error:Only secure origins are allowed (see:https://goo.gl/Y0ZkNV)..
  12. 【网络原理】数据链路层
  13. 非接触式IC卡的分类(三)
  14. linux 循环一段ip区间,Shell脚本实现判断IP地址是否在一个ip段内代码分享
  15. 自己设计一个美观的网页版介绍界面(HBuilder)
  16. 华为eNSP路由器报错误代码:40,41的问题解决办法。路由器启动无限###。eNSP安装。
  17. 数仓工具—Hive集成篇之Kafka(03)
  18. larvel 5.7命令行cmd常用命令
  19. Apche Phoenix,Spark的绝配搭档
  20. ant design vue 1.7.8版本treeSelect组件坑

热门文章

  1. androd hook acitivity 启动流程,替换启动的activity(Android Instrumentation)
  2. android 布局preview 技巧
  3. Robolectric
  4. 一次Binder通信最大可以传输多大的数据?
  5. wireshark网络分析就这么简单_【读书笔记】2wireshark网络分析就这么简单——不同子网如何发送消息。...
  6. android横竖屏切换生命周期
  7. iOS UITest之加载其他应用
  8. python中的数据写入与添加数据写入文件(to_csv)
  9. LINUX中printf与echo的区别
  10. java语法基础(总结)