目录

Spring Boot Starter项目创建

自动创建客户端

使用 Starter

使用注解开启 Starter 自动构建

使用配置开启 Starter 自动构建

配置 Starter 内容提示

Spring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音,通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架。

目前提供的 Spring Boot Starter 包有:

  • spring-boot-starter-web:快速构建基于 Spring mvc 的 Web 项目,使用 Tomcat 做默认嵌入式容器。
  • spring-boot-starter-data-redis:操作 Redis。
  • spring-boot-starter-data-mongodb:操作 Mongodb。
  • spring-boot-starter-data-jpa:操作 Mysql。
  • spring-boot-starter-activemq:操作 Activemq。
  • ……

自动配置非常方便,当我们要操作 Mongodb 的时候,只需要引入 spring-boot-starter-data-mongodb 的依赖,然后配置 Mongodb 的链接信息 spring.data.mongodb.uri=mongodb://localhost/test 就可以使用 MongoTemplate 来操作数据,MongoTemplate 的初始化工作全部交给 Starter 来完成。

自动配置麻烦的是当出现错误时,排查问题的难度上升了。自动配置的逻辑都在 Spring Boot Starter 中,要想快速定位问题,就必须得了解 Spring Boot Starter 的内部原理。接下来我们自己动手来实现一个 Spring Boot Starter。

Spring Boot Starter项目创建

创建一个项目 spring-boot-starter-demo,pom.xml 配置代码如下所示。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

创建一个配置类,用于在属性文件中配置值,相当于 spring.data.mongo 这种形式,代码如下所示。

import org.springframework.boot.context.properties.ConfigurationProperties;
import lombok.Data;
@Data
@ConfigurationProperties("spring.user")
public class UserPorperties {private String name;
}

再定义一个 Client,相当于 MongoTemplate,里面定一个方法,用于获取配置中的值,代码如下所示。

public class UserClient {private UserPorperties userPorperties;public UserClient() {}public UserClient(UserPorperties p) {this.userPorperties = p;}public String getName() {return userPorperties.getName();}
}

自动创建客户端

一个最基本的 Starter 包定义好了,但目前肯定是不能使用 UserClient,因为我们没有自动构建 UserClient 的实例。接下来开始构建 UserClient,代码如下所示。

@Configuration
@EnableConfigurationProperties(UserPorperties.class)
public class UserAutoConfigure {@Bean@ConditionalOnProperty(prefix = "spring.user", value = "enabled", havingValue = "true")public UserClient userClient(UserPorperties userPorperties) {return new UserClient(userPorperties);}
}

Spring Boot 会默认扫描跟启动类平级的包,假如我们的 Starter 跟启动类不在同一个主包下,如何能让 UserAutoConfigure 生效?

在 resources 下创建一个 META-INF 文件夹,然后在 META-INF 文件夹中创建一个 spring.factories 文件,文件中指定自动配置的类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cxytiandi.demo.UserAutoConfigure

Spring Boot 启动时会去读取 spring.factories 文件,然后根据配置激活对应的配置类,至此一个简单的 Starter 包就实现了。

使用 Starter

现在可以在其他的项目中引入这个 Starter 包,代码如下所示。


<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>spring-boot-starter-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

引入之后就直接可以使用 UserClient,UserClient 在项目启动的时候已经自动初始化好,代码如下所示。


@RestController
public class UserController {@Autowired
private UserClient userClient;@GetMapping("/user/name")
public String getUserName() {
return userClient.getName();
}
}

属性文件中配置 name 的值和开启 UserClient:

spring.user.name=zhangsan
spring.user.enabled=true

访问 /user/name 就可以返回我们配置的 zhangsan。

使用注解开启 Starter 自动构建

很多时候我们不想在引入 Starter 包时就执行初始化的逻辑,而是想要由用户来指定是否要开启 Starter 包的自动配置功能,比如常用的 @EnableAsync 这个注解就是用于开启调用方法异步执行的功能。

同样地,我们也可以通过注解的方式来开启是否自动配置,如果用注解的方式,那么 spring.factories 就不需要编写了,下面就来看一下怎么定义启用自动配置的注解,代码如下所示。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({UserAutoConfigure.class})
public @interface EnableUserClient {}

这段代码的核心是 @Import({UserAutoConfigure.class}),通过导入的方式实现把 UserAutoConfigure 实例加入 SpringIOC 容器中,这样就能开启自动配置了。

使用方式就是在启动类上加上该注解,代码如下所示。


@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}

使用配置开启 Starter 自动构建

在某些场景下,UserAutoConfigure 中会配置多个对象,对于这些对象,如果不想全部配置,或是想让用户指定需要开启配置的时候再去构建对象,这个时候我们可以通过 @ConditionalOnProperty 来指定是否开启配置的功能,代码如下所示。


@Bean
@ConditionalOnProperty(prefix = "spring.user",value = "enabled",havingValue = "true")
public UserClient userClient(UserPorperties userPorperties) {
return new UserClient(userPorperties);
}

通过上面的配置,只有当启动类加了 @EnableUserClient 并且配置文件中 spring.user.enabled=true 的时候才会自动配置 UserClient。

配置 Starter 内容提示

在自定义 Starter 包的过程中,还有一点比较重要,就是对配置的内容项进行提示,需要注意的是,Eclipse 中是不支持提示的,Spring Tools 4 for Eclipse 中可以提示。

定义提示内容需要在 META-INF 中创建一个 spring-configuration-metadata.json 文件,代码如下所示。

{ "properties": [ { "name": "spring.user.name", "defaultValue": "cxytinadi" }, { "name": "spring.user.enabled", "type": "java.lang.Boolean", "defaultValue": false } ] }
  • name:配置名
  • type:配置的数据类型
  • defaultValue:默认值

上一篇《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》

下一篇 介绍Spring Cloud Eureka是什么

相关springboot实战项目推荐

基于java ssm springboot+VUE疫情防疫系统系统前后端分离设计和实现

基于java springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现

查看更多首页实战项目 >>>


《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》相关推荐

  1. 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》

    Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能. S ...

  2. 《springcloud超级入门》Spring Boot简介《五》

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置. ...

  3. 《springcloud超级入门》Spring Cloud和Dubbo的区别及各自的优缺点《三》

    了解为什么需要微服务.最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转. 这种架构存在很多问题:Nginx 作为中间 ...

  4. boot入门思想 spring_(第一讲)Spring Initializr-快速入门Spring Boot的最好选择

    1讲:Spring Initializr-快速入门Spring Boot的最好选择 Spring Initializr [http://start.spring.io/]是引导你快速构建Spring ...

  5. 手把手教你定制标准 Spring Boot starter

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...

  6. 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  7. 自定义 Spring Boot Starter

    一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...

  8. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

    1.前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世.目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用.S ...

  9. 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下

    我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...

最新文章

  1. 怎么卸载云骑士装机大师
  2. 计算力即生产力,智算中心就是智慧时代的“发电厂” | MEET2021
  3. windows聚焦壁纸不更新_技术编辑示范win10系统锁屏壁纸聚焦不更新的处理教程
  4. Google Desktop 果然
  5. ExcelManager--基于.Net的Excel读写管理类库(一)
  6. 怎么查看WordPress主题HTML,几个WordPress 主题在线检测工具
  7. 设计模式的七大设计原则:其二:接口隔离原则
  8. sql转化为int类型
  9. Matlab遗传算法实例
  10. java集成极光推送
  11. 如何免费制作微信小程序?详细步骤
  12. python powerbi知乎_数据分析-PowerBI
  13. 青春散场,初心不忘【致毕业季理想主义的你】
  14. mysql:Row size too large (> 8126)
  15. word中文字后面的空格加不上下划线
  16. 锁记——偏向锁注定过不好这一生
  17. 敏捷迭代就是小瀑布吗?为什么创业团队更敏捷?
  18. xboxone硬盘坏的表现_硬盘数据恢复方法实测:硬盘坏了能恢复数据吗?
  19. ecshop + 主从 + memcache + memcache监控
  20. 如何能更更好的装逼 (Windows CMD命令大全)

热门文章

  1. maya批量操作mel_MAYA对多个模型使用当前设置批量渲染并保存图片的MEL脚本
  2. imx6 android快速启动,android启动不起来(已解决)
  3. win7如何关闭密码保护共享
  4. Android播放器之SurfaceView与GLSurfaceView
  5. 轮播高度_Qt编写自定义控件24-图片轮播控件
  6. hashMap 底层原理+LinkedHashMap 底层原理+常见面试题
  7. Java基础篇4——数组
  8. vue3.0中使用Element-plus默认英文组件修改为中文
  9. Java的Comparator排序(升序降序)理解
  10. c语言打印字符的函数参数,C语言格式化打印函数vsnprintf()的实现