《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实现的抗疫物质信息管理系统设计和实现

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 发送短信 sms,php 调用百度sms来发送短信的实现示例

BaiduSms百度云 sms php版本官方没有给出php版本的短信发送sdk, 在此借鉴 [ 点击这里 ]&#xff0c;并在此基础上将方法改成 单例模式 在原来的基础上更加容易调用1.打开 BaiduSms.php 修改 sms函数中 accessKey 、 secretAccessKey 这两个参数登录百度云账号&#xff0c;在右上…

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

Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分&#xff0c;基于 Netflix Eureka 做了二次封装&#xff0c;主要负责实现微服务架构中的服务治理功能。 Spring Cloud Eureka 是一个基于 REST 的服务&#xff0c;并且提供了基于 Java 的客户端组件&#xff0c…

php 常用编译参数,php编译参数,不用怕!!

很多初学者&#xff0c;在编译php的时候&#xff0c;容易被php的编译参数吓到&#xff01;例如&#xff1a;./configure \--prefix/usr/local/php \--with-config-file-path/usr/local/php/etc \--enable-inline-optimization \--disable-debug \--disable-rpath \--enable-sha…

《SpringCloud超级入门》使用Eureka编写注册中心服务《九》

首先创建一个 Maven项目&#xff0c;取名为 eureka-server&#xff0c;在 pom.xml 中配置 Eureka 的依赖信息&#xff0c;代码如下所示。 <!-- Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot…

php设置表单为整数,PHP中如何判断FROM表单提交的数字是否为整数?

在php开发中我们经常需要用表单传递数据&#xff0c;如果我们传递的是整数(int)&#xff0c;经过表单传递后&#xff0c;在接收页面整数的数值类型将会变成字符串(string)类型,这样我们就不能用is_int()函数来判断是否为整数&#xff0c;但是我们可以用is_numeric()和strpos()函…

《SpringCloud超级入门》使用Eureka编写服务提供者《十》

创建项目注册到 Eureka 将一个服务提供者 eureka-client-user-service 注册到 Eureka 中&#xff0c;并提供一个接口给其他服务调用。 创建一个 Maven 项目&#xff0c;在 pom.xml 中增加相关依赖 <parent> <groupId>org.springframework.boot</groupId> &l…

PHP苹果不给上架,苹果商城上架拒绝

苹果商城一直被拒绝&#xff0c;原因说是有支付宝支付功能&#xff0c;需要内购。但我配置中已经把支付宝支付功能去掉了&#xff0c;也勾上了应用内支付&#xff0c;但还是被拒绝&#xff0c;不知道什么原因&#xff0c;请问我该如何整改&#xff1f;是由于HBuilderX云打包默认…

《SpringCloud超级入门》使用Eureka编写服务消费者《十一》

我们先从 Nginx 说起&#xff0c;了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名&#xff0c;然后服务调用者向这个域发送 HTTP 请求&#xff0c;由 Nginx 负责请求的分发和跳转。 这种架构存在很多问题&#xff1a;Nginx 作为中间层&#xff0c;在…

java echarts 散点图,echarts在地图上绘制散点图(任意点)

项目需求&#xff1a;在省份地图上绘制散点图&#xff0c;散点位置不一定是哪个城市或哪个区县&#xff0c;即任意点通过查询官网文档&#xff0c;找到一个与需求类似的Demo&#xff1a;https://www.echartsjs.com/gallery/editor.html?cscatter-map&#xff0c;更改代码&…

《SpringCloud超级入门》Eureka注册中心开启密码认证《十二》

Eureka 自带了一个 Web 的管理页面&#xff0c;方便我们查询注册到上面的实例信息&#xff0c;但是有一个问题&#xff1a;如果在实际使用中&#xff0c;注册中心地址有公网 IP 的话&#xff0c;必然能直接访问到&#xff0c;这样是不安全的。所以我们需要对 Eureka 进行改造&a…

php如何直接使用iview,iview 使用总结

vueiview 开发后台系统问题总结tags用了keep-alive 包裹 router-view,页面进行缓存点击tag可切换,不会重新渲染在特定页面比如详情页需要每次刷新的时候,添加watch $route 进行相关的刷新,导致了另外一个问题,最初跳转时用的 params传参,刷新参数就没了,特改为query传参.涉及到…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统《建议收藏》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

JAVA输出菱形并使用绝对值,案例用绝对值的方法打印出菱形

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入菱形的层高(层高为奇数):");int num sc.nextInt();// 控制输入层高为奇数while (num % 2 0) {System.out.p…

基于java TCP实现网络通信聊天室《建议收藏附完整源码》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

mysql 获取年预提,【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。...

【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。更多相关问题[单选] 如果整条线组件压力突然升高&#xff0c;原因可能是()。[多选] 风机的常见故障有()。[单选] 侧吹风窗安装过程中应注意()。[判断题] 组件的压力波动会影响产品的质量。[单选] …

《零基础》MySQL 正则表达式(二十一)

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。 实例操作 查找name字段中以st为开头的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ^st; 查找name字段中以ok为结尾的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ok$;…

ORACLE 12C采坑之 ORA-12541:TNS:无监听程序

目录 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否有错误: 4.重新配置监听器Net Configuration Assistant 5.之后重启OracleServiceORCL服务 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否…

无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang

题目&#xff1a;给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复…

《SpringCloud超级入门》使用Eureka集群搭建《十三》

前面我们搭建的注册中心只适合本地开发使用&#xff0c;在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单&#xff1a;每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。 以 2 个节点为例来说明搭建方式。假设我们有…

centos7 python3 sqlserver,centos7中python3环境支持s

在centos7环境中常规安装python3的话无法支持sqlite3和ssl,所以在安装pytho3是需要带上sqlite3库和ssl库:下载编译安装sqlite3:# wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz --no-check-certificate# ./configure --prefix/usr/local/sqlite3 --disable…