目录
本文学习下如何在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,其实就是添加我们的组件到自动配置。