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

本文涉及的产品
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,其实就是添加我们的组件到自动配置。


相关文章
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1267 0
|
5月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
933 0
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
320 3
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
410 2
|
5月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
9月前
|
Java Spring
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
462 8
|
9月前
|
Java
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
|
9月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
1240 12
|
8月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
548 0

热门文章

最新文章