文章目录
- 目录
- 一、写个starter
- 二、项目中如何使用自定义的starter
- 1.@Enable*方式启动自定义starter
- ①写个注解:通过import注入自定义的starter的注入
- ②.入口中启动自动配置redis的starter注解并测试
- 2.META-INF的factories.properties配置方式使用starter:
- ①配置starter
- ②入口中测试
目录
本文学习下如何在springboot2下,自定义starter:说是starter其实就是自动配置项,比如写了个组件,想springboot启动时候帮我们注入,我以前想过引入个jar包不就行了,但是starter添加到springboot自动配置有诸多好处: 比如可以按条件注入我们写的类,可以动态配置的一些配置属性。
springboot已经为我们配置了很多默认的配置项,我们也可以自己添加配置。其实这个功能并不陌生,就是之前讲到的自动注册的原理,原理不在重复说明。
概要如下:
自定义starter端分为如何写,写了如果使用。现在先看第一步:
本文来个最简单的例子。就自定义一个redis客户端的starter。然后让我们的springboot项目引入starter的jar包,然后配置属性ip和端口就可调用redis客户端的功能。
一、写个starter
新建个maven项目:
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();
}
}
看下运行结果:
可以看到我们:手动在配置文件中的地址和端口,已经配置在了我们自定义的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启用成功:
总结:本文,就以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每一天
不定时推送相关文章,期待和大家一起成长!!
完