前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 自定义 Starter

Spring Boot 自定义 Starter

作者头像
技术从心
发布2019-10-13 22:47:10
6420
发布2019-10-13 22:47:10
举报
文章被收录于专栏:技术从心技术从心

我们在学习springboot的过程中发现springboot的使用起来非常的简单和方便,在使用springboot明显不用像ssm框架那样配置一大推动的东西,虽说如果熟练的话用起来并不难,但是很烦。

在我们使用springboot框架的同时也要了解启动器 starter 默认地自动化配置是如何工作的,还是非常有必要的!所以今天就大概看了一些例子照着做了一下总结和编码。

新建maven项目

为其取名为:girl-friend-spring-boot-starter.

Spring 官方对 starter 的命名是有规范的,只有官方提供的 starter, 才能命名为 spring-boot-starter-{name}, 比如 spring-boot-starter-web; 而对于非官方的,需以 {name}-spring-boot-starter 的格式命名。

添加依赖

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.2.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>iclyj.cn</groupId>    <artifactId>girl-friend-spring-boot-starter</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>girl-friend-spring-boot-starter</name>    <description>Custom Spring Starter</description>
    <properties>        <java.version>1.8</java.version>    </properties>
    <dependencies>    <!-- 自动化配置依赖,自定义 starter 核心依赖包-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-autoconfigure</artifactId>        </dependency>
        <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-configuration-processor</artifactId>             <optional>true</optional>         </dependency>
    </dependencies>
</project>

新增功能类

一个一个来

GirlFriendServiceProperties.java:

代码语言:javascript
复制
package iclyj.cn.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * @ConfigurationProperties注解能够自动获取 application.properties 配置文件中前缀为 * spring.girlfriend 节点下 message属性的内容,这里我们给了它一个默认值: Hello World !。 * */@ConfigurationProperties(prefix = "iclyj.girlfriend")public class GirlFriendServiceProperties {
    /** 默认输出 */    private String message = "Hello World !";
    public String getMessage() {        return message;    }
    public void setMessage(String message) {        this.message = message;    }
}

这里注意一下如果我注释掉下面这个依赖

他就会出现上图的情况我们点进去打开

虽说去掉这个依赖不会影响项目正常运行但是看过去总是很别扭具体深入的什么原因可以自己看看文档。

GirlFriendService.java:

代码语言:javascript
复制
package iclyj.cn.service;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 */public interface GirlFriendService {
    /**     * 调用方法     */    void say();}

GirlFriendServiceImpl.java:

代码语言:javascript
复制
package iclyj.cn.service;
package iclyj.cn.service.impl;
import iclyj.cn.config.GirlFriendServiceProperties;import iclyj.cn.service.GirlFriendService;import org.springframework.beans.factory.annotation.Autowired;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * GirlFriendServiceImpl 实现了 GirlFriendService 接口的 say() 方法, * 它会获取 GirlFriendServiceProperties 配置类 message 内容,并打印到控制台。 * */public class GirlFriendServiceImpl implements GirlFriendService {
    @Autowired    private GirlFriendServiceProperties girlFriendServiceProperties;
    @Override    public void say() {        String message = girlFriendServiceProperties.getMessage();        System.out.println("Girl Friend: " + message);    }}

新增自动配置类(重点)

代码语言:javascript
复制
package iclyj.cn.config;
import iclyj.cn.service.GirlFriendService;import iclyj.cn.service.impl.GirlFriendServiceImpl;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * @Configuration: 标注类为一个配置类,让 spring 去扫描它; * @ConditionalOnClass:条件注解,只有在 classpath 路径下存在指定 class 文件时,才会实例化 Bean; * @EnableConfigurationProperties:使指定配置类生效; * @Bean: 创建一个实例类注入到 Spring Ioc 容器中; * @ConditionalOnMissingBean:条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。 * * * Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories, * 若有,就会根据配置的类的全路径去自动化配置。 * */
@Configuration@ConditionalOnClass(GirlFriendService.class)@EnableConfigurationProperties(GirlFriendServiceProperties.class)public class GirlFriendAutoConfiguration {
    @Bean    @ConditionalOnMissingBean    public GirlFriendService girlFriendService() {        return new GirlFriendServiceImpl();    }
}

新增spring.factories文件

resources 目录下创建名为 META-INF 的目录,并新建文件 spring.factories,内容如下:

# 指定刚刚创建的 GirlFriendAutoConfiguration 的全路径名 org.springframework.boot.autoconfigure.EnableAutoConfiguration=site.exception.GirlFriendAutoConfiguration

Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories,若有,就会根据配置的类的全路径去自动化配置。

将项目打包

新增一个项目就可以引用starter了

可以看到已经调用成功了,接下来,我们手动配置一下新的打招呼内容,看看是否能自动获取到。

application.properties 文件中配置如下:

运行一下项目

正确打印我们自己配置的:“I LOVE YOU”,大功告成。

GitHub源码地址:

https://github.com/ICLYJ/Girl-Friend.git

总结:

到此自定义 spring-boot-starter 已经完成,从中你也可以了解到springbot启动加载的大致流程就是这样,要想深入的学习还得学习更多知识。

每天

进步一点点

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新建maven项目
  • 添加依赖
  • 新增功能类
  • 新增自动配置类(重点)
  • 新增spring.factories文件
  • 新增一个项目就可以引用starter了
  • GitHub源码地址:
  • 总结:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档