0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​目录​​
  • ​​一、写个starter​​
  • ​​二、项目中如何使用自定义的starter​​
  • ​​1.@Enable*方式启动自定义starter​​
  • ​​①写个注解:通过import注入自定义的starter的注入​​
  • ​​②.入口中启动自动配置redis的starter注解并测试​​
  • ​​2.META-INF的factories.properties配置方式使用starter:​​
  • ​​①配置starter​​
  • ​​②入口中测试​​

目录

本文学习下如何在springboot2下,自定义starter:说是starter其实就是自动配置项,比如写了个组件,想springboot启动时候帮我们注入,我以前想过引入个jar包不就行了,但是starter添加到springboot自动配置有诸多好处: 比如可以按条件注入我们写的类,可以动态配置的一些配置属性。
springboot已经为我们配置了很多默认的配置项,我们也可以自己添加配置。其实这个功能并不陌生,就是之前讲到的自动注册的原理,原理不在重复说明。

概要如下:

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

自定义starter端分为如何写,写了如果使用。现在先看第一步:
本文来个最简单的例子。就自定义一个redis客户端的starter。然后让我们的springboot项目引入starter的jar包,然后配置属性ip和端口就可调用redis客户端的功能。

一、写个starter

新建个maven项目:

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


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();
}
}

看下运行结果:

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


可以看到我们:手动在配置文件中的地址和端口,已经配置在了我们自定义的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启用成功:

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

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

代码地址:

自定义starter: ​​https://github.com/hufanglei/springboot-v-study/tree/spring-boot-starter-redis​​​ 使用starter:
​​https://github.com/hufanglei/springboot-v-study/tree/springboot-web-starter-use​​

个人微信公号:

搜索: 怒放de每一天

不定时推送相关文章,期待和大家一起成长!!

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


举报

相关推荐

0 条评论