springboot启动流程的系列文章中,我们看过了springboot的自动配置机制,本文将基于自动配置机制自定义一个自动配置的starter示例

正文

模块结构

首先,我们准备两个模块service和web,模块结构如

service模块

在service模块中,我们添加一个服务类TestService

public class TestService {

    public String getName() {
return "lay";
}
}

接着再添加一个ServiceAutoConfiguration配置类,将TestService变成一个Bean

public class ServiceAutoConfiguration {

    @Bean
public TestService testService() {
return new TestService();
}
}

还有最重要的一步,将ServiceAutoConfiguration添加到META-INF/spring.factories中成为自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.lay.service.ServiceAutoConfiguration

这样,service就完毕了,我们看看service模块的结构

web模块

我们先在web的pom.xml文件中添加service的模块依赖

<dependency>
<groupId>cn.lay</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

再添加一个TestController

@RestController
public class TestController { @Autowired
private TestService testService; @GetMapping("getName")
public String getName() {
return testService.getName();
}
}

启动测试

当我们启动web以后,会根据service的META-INF/spring.factories中配置的自动配置类把TestService变成Bean,然后注入到TestController中

我们打开浏览器测试一下

可以看到,我们成功执行获得结果

添加条件化注解

在META-INF/spring.factories中添加配置类,但是很多时候我们希望配置类在满足一些条件的时候才生效,为此我们可以使用@Conditional注解或者组合了@Conditional注解的注解

本例中,我们将在ServiceAutoConfiguration中使用使用@ConditionalOnClass注解,该注解表示当某个类存在的时候配置类才生效

@ConditionalOnClass(name = "java.lang.String")
public class ServiceAutoConfiguration { @Bean
public TestService testService() {
return new TestService();
}
}

注解中指明,当String类存在的时候ServiceAutoConfiguration才会进行解析处理,而如果你指明一个不存在的类,如:java.lang.String2,那么TestService将不会被解析成一个Bean

添加properties

我们先在service模块的pom.xml中添加properties处理依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

添加一个配置属性对象

@ConfigurationProperties(prefix = "service")
public class ServiceProperties {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "ServiceProperties{" +
"name='" + name + '\'' +
'}';
}
}

在ServiceAutoConfiguration添加为Bean,开启属性自动解析

@ConditionalOnClass(name = "java.lang.String")
@EnableConfigurationProperties(value = {ServiceProperties.class})
public class ServiceAutoConfiguration { @Bean
public TestService testService() {
return new TestService();
}
}

把ServiceProperties注入到TestService中

public class TestService {

    @Autowired
private ServiceProperties serviceProperties; public String getName() {
return serviceProperties.getName();
}
}

回到web模块,在application.properties中添加配置

service.name=lay

重新启动测试,你会看到浏览器获取到了结果

总结

springboot的自动配置,其实就是包了一层自动发现(spi机制)的spring.factories配置,然后通过@Conditional相关的条件化处理来决定是否进行配置类的解析工作。

如何自定义starter的更多相关文章

  1. SpringBoot之旅第六篇-启动原理及自定义starter

    一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...

  2. Spring Boot 自定义 starter

    一.简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应 ...

  3. java框架之SpringBoot(10)-启动流程及自定义starter

    启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...

  4. SpringBoot应用篇(一):自定义starter

    一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...

  5. SpringBoot第十六篇:自定义starter

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11058502.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   这一段时间 ...

  6. 小代学Spring Boot之自定义Starter

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  7. (springboot)自定义Starter

    要引入的jar项目,即自定义的Starter项目: pom:(这里不能引入springboot整合否则测试项目注入失败) <?xml version="1.0" encodi ...

  8. SpringBoot自定义starter及自动配置

    SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目.除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目. 自定义starter条件 自动 ...

  9. 对照谈-官方spring-boot-starter和自定义starter异同分析

    在前面我讲用spring-boot-starter-mail发邮件的时候,我侧重看的是spring boot发邮件的便利性,今天,我们聊下另外一个方面,spring-boot-starter自身的结构 ...

  10. SpringBoot自定义Starter实现

    自定义Starter: Starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦.Starter 提供了一种开箱即用的理念,其中核心就是springboot的自动配置原理相 ...

随机推荐

  1. VS中卸载Visual Assist X

    Tools=>Extensions and updates=>找到Visual Assist X 卸载:

  2. centos上安装Python并修复yum

    date: 2019-07-01  18:09:53 author: headsen chen notice: 个人原创 1,安装python3.7: yum install zlib-devel b ...

  3. Quartz调度系统入门和调度高可用实现方案

    ** 版本:2.2.1 ** Hello world: https://www.jianshu.com/p/810400e6a274

  4. 一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题

    提示:ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'.前两天也出现过这个问题,网上找了一个比 ...

  5. Oracle中查询当前时间、时间格式化方法

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;  ORACLE里获取一个时间的年.季.月.周. ...

  6. Centos7彻底删除PHP

    查看php版本命令: #php -v 下面的命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #php -v 还是会看到有版本信息的..... 必须强制删除,使用下面命令查 ...

  7. topK问题

    概述 在N个乱序数字中查找第K大的数字,时间复杂度可以减小至O(N). 可能存在的限制条件: 要求时间和空间消耗最小.海量数据.待排序的数据可能是浮点型等. 方法 方法一 对所有元素进行排序,之后取出 ...

  8. linux一行命令查杀进程

    https://blog.csdn.net/primeprime/article/details/52415273 ps -efww | grep -w 'helloworld' | grep -v ...

  9. java面试考点-面试准备

    面试前准备 了解应试公司相关信息及岗位信息 系统复习基础知识 对原公司负责项目进行梳理 阅读常规框架源码 学习典型架构案例 针对招聘文案准备加分项 相关技能 基础知识:进程/线程,TCP协议,HTTP ...

  10. tab页签

    <div class="fl" id="newsBox"> <div class="tab1 grayBar"> & ...