JAVA技术文章

spring boot : 定制自己的starter

2017-12-06  本文已影响49人  rejoice001

spring boot的starter本质上是加载配置类,既给类加上@configurateion并导入。

可以有2种方式,以官方redis为例

1、标准的starter制定方式

创建一个父子工程包含2个模块

模块1:redis-company-autoconfigure

第一步:编写RedisAutoConfiguration

注意:@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }),标明需要依赖redis才会执行加载

第二步:编写pom文件

可以发现redis的依赖加了可选依赖为true,对于maven官方解释http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

从文档上得知:项目a依赖了redis,并且是optional,然后项目b依赖了项目a,那么在项目b中并没有真正引入redis依赖,需要显示依赖redis(不加optional)

第三步:在src/resources/META-INFO下创建spring.factories文件,内容为:

Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ \代表换行

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

spring boot的@SpringBootApplication或@EnableAutoConfiguration开启自动配置会自动加载所有第三方jar包下的src/resources/META-INFO/spring.facotries中定义的所有组件(自己项目classpath若有会优先加载,第三方的就失效),这样完成了配置类的加载。

但是 由于redisautoconfiguration中加上了@ConditionalOnClass,而redis-company-autoconfigure模块的pom的redis的依赖是optional,如果项目中只导入该模块的话是没有redis依赖的,第二个模块就是引入依赖

模块2:创建redis-company-starter模块,pom形式

这个模块只有一个pom文件:作用是真正引入starter(redis)所有的依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.3.8.RELEASE</version>
</parent>
<artifactId>spring-boot-starter-redis</artifactId>
<name>Spring Boot Redis Starter</name>
<description>Spring Boot Redis Starter</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
</project>

到此为止starter已经编写完毕

项目中使用自己定义的starter

很简单,只需要引入redis-company-autofigure和redis-company-starter2个依赖即可

ps:spring-boot中只所以只需要引入spring-boot-redis-starter即可,是因为spring-boot-autoconfigure已经提供了各种组件的实现

标准的写法真实麻烦,下面来看看第二种实现

2、使用添加Enable*的注解方式来实现

其实道理都是一样的

创建一个jar包形式redis-company-autoconfigure的工程

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RedisAutoConfiguration.class)
public @interface EnableRedisAutoConfiguration{
}

这个注解的作用是导入RedisAutoConfiguration,跟启动类@ImportResource是一样的效果,无非就是包一层(华丽的外表哈哈)

使用:

end !

上一篇下一篇

猜你喜欢

热点阅读