《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》
目录
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的介绍及使用《七》相关推荐
- 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能. S ...
- 《springcloud超级入门》Spring Boot简介《五》
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置. ...
- 《springcloud超级入门》Spring Cloud和Dubbo的区别及各自的优缺点《三》
了解为什么需要微服务.最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转. 这种架构存在很多问题:Nginx 作为中间 ...
- boot入门思想 spring_(第一讲)Spring Initializr-快速入门Spring Boot的最好选择
1讲:Spring Initializr-快速入门Spring Boot的最好选择 Spring Initializr [http://start.spring.io/]是引导你快速构建Spring ...
- 手把手教你定制标准 Spring Boot starter
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...
- 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...
Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...
- 自定义 Spring Boot Starter
一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...
- 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
1.前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世.目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用.S ...
- 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下
我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...
最新文章
- 怎么卸载云骑士装机大师
- 计算力即生产力,智算中心就是智慧时代的“发电厂” | MEET2021
- windows聚焦壁纸不更新_技术编辑示范win10系统锁屏壁纸聚焦不更新的处理教程
- Google Desktop 果然
- ExcelManager--基于.Net的Excel读写管理类库(一)
- 怎么查看WordPress主题HTML,几个WordPress 主题在线检测工具
- 设计模式的七大设计原则:其二:接口隔离原则
- sql转化为int类型
- Matlab遗传算法实例
- java集成极光推送
- 如何免费制作微信小程序?详细步骤
- python powerbi知乎_数据分析-PowerBI
- 青春散场,初心不忘【致毕业季理想主义的你】
- mysql:Row size too large (> 8126)
- word中文字后面的空格加不上下划线
- 锁记——偏向锁注定过不好这一生
- 敏捷迭代就是小瀑布吗?为什么创业团队更敏捷?
- xboxone硬盘坏的表现_硬盘数据恢复方法实测:硬盘坏了能恢复数据吗?
- ecshop + 主从 + memcache + memcache监控
- 如何能更更好的装逼 (Windows CMD命令大全)
热门文章
- maya批量操作mel_MAYA对多个模型使用当前设置批量渲染并保存图片的MEL脚本
- imx6 android快速启动,android启动不起来(已解决)
- win7如何关闭密码保护共享
- Android播放器之SurfaceView与GLSurfaceView
- 轮播高度_Qt编写自定义控件24-图片轮播控件
- hashMap 底层原理+LinkedHashMap 底层原理+常见面试题
- Java基础篇4——数组
- vue3.0中使用Element-plus默认英文组件修改为中文
- Java的Comparator排序(升序降序)理解
- c语言打印字符的函数参数,C语言格式化打印函数vsnprintf()的实现