springboot2原理实战(18)--自定义starter

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: springboot2原理实战(18)--自定义starter

目录


本文学习下如何在springboot2下,自定义starter:说是starter其实就是自动配置项,比如写了个组件,想springboot启动时候帮我们注入,我以前想过引入个jar包不就行了,但是starter添加到springboot自动配置有诸多好处: 比如可以按条件注入我们写的类,可以动态配置的一些配置属性。

springboot已经为我们配置了很多默认的配置项,我们也可以自己添加配置。其实这个功能并不陌生,就是之前讲到的自动注册的原理,原理不在重复说明。


概要如下:

1dc618a0ed9580ce8bfa6facb208c08f.png


自定义starter端分为如何写,写了如果使用。现在先看第一步:

本文来个最简单的例子。就自定义一个redis客户端的starter。然后让我们的springboot项目引入starter的jar包,然后配置属性ip和端口就可调用redis客户端的功能。


一、写个starter


新建个maven项目:

5d4c6812c8535adbb050f4ddf2e1bce8.png


pom:


<?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.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springboot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-starter-redis</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
       <!--引入redis的客户端-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


写个配置类:


RedisProperties
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
    private String host;
    private Integer port;
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
}

最重要的类:读取配置文件内容,注入一个redis的bean,后面测试主要看这个redis好使不:

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;
import redis.clients.jedis.Jedis;
@Configuration
@ConditionalOnClass(Jedis.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoCongfiguration {
    @Bean
    @ConditionalOnMissingBean(Jedis.class)
    public Jedis jedis(RedisProperties redisProperties){
        return new Jedis(redisProperties.getHost(), redisProperties.getPort());
    }
}


最后,打成jar包。


二、项目中如何使用自定义的starter


这里有个2种方式:第一种是@Enable开头注解方式,第二种是在META/INF的factories.properties注入方式:

首先建个最简单的springboot项目:

然后写个配置属性:application.properties

让redis访问本地的,端口是6379


redis.host=127.0.0.1
redis.port=6379


引入我们自定义的starter jar包


<dependency>
     <groupId>com.springboot</groupId>
     <artifactId>spring-boot-starter-redis</artifactId>
     <version>0.0.1-SNAPSHOT</version>
 </dependency>


1.@Enable*方式启动自定义starter


①写个注解:通过import注入自定义的starter的注入


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RedisAutoCongfiguration.class)
public @interface EnableRedis {
}


②.入口中启动自动配置redis的starter注解并测试


@EnableRedis
@SpringBootApplication
public class Demo18Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo18Application.class, args);
        Jedis jedis = context.getBean(Jedis.class);
        System.out.println(jedis.getClient().getHost());
        System.out.println(jedis.getClient().getPort());
        jedis.set("id","123");
        System.out.println(jedis.get("id"));
//        context.close();
    }
}


看下运行结果:


1dc618a0ed9580ce8bfa6facb208c08f.png

可以看到我们:手动在配置文件中的地址和端口,已经配置在了我们自定义的redis的starter中,并且可以使用了:给了个id的key,可以打印出123的结果。


说明starter启用成功。


2.META-INF的factories.properties配置方式使用starter:


①配置starter


这个最简单:

只写一个配置文件就行了:spring.factories


org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.springboot.springbootstarterredis.RedisAutoCongfiguration


②入口中测试


@SpringBootApplication
public class Demo18Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo18Application.class, args);
        Jedis jedis = context.getBean(Jedis.class);
        System.out.println(jedis.getClient().getHost());
        System.out.println(jedis.getClient().getPort());
        jedis.set("id","123");
        System.out.println(jedis.get("id"));
//        context.close();
    }
}


打印结果如下:说明:stareter启用成功:

5d4c6812c8535adbb050f4ddf2e1bce8.png


总结:本文,就以redis客户端的starter为例子,自定义了这个starter,其实就是添加我们的组件到自动配置。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
279 0
|
2月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
41 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
268 2
|
2天前
|
JavaScript Java 程序员
SpringBoot自动配置及自定义Starter
Java程序员依赖Spring框架简化开发,但复杂的配置文件增加了负担。SpringBoot以“约定大于配置”理念简化了这一过程,通过引入各种Starter并加载默认配置,几乎做到开箱即用。
38 10
SpringBoot自动配置及自定义Starter
|
16天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
16天前
|
Java 数据库连接 Maven
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
最新版 | SpringBoot3如何自定义starter(面试常考)
|
23天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
81 14
|
2月前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
64 17
|
2月前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
|
2月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
68 0