spring boot : 定制自己的starter
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的工程
- 1.第一步:编写RedisAutoConfiguration,跟之前
- 2.第二步:编写pom文件,跟之前不同的是这里不需要加optional,直接引入依赖,从而省略了官方的starter
- 3.第三步:编写EnableRedisAutoConfiguration注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RedisAutoConfiguration.class)
public @interface EnableRedisAutoConfiguration{
}
这个注解的作用是导入RedisAutoConfiguration,跟启动类@ImportResource是一样的效果,无非就是包一层(华丽的外表哈哈)
使用:
- 1.添加依赖redis-company-autoconfigure
- 2.启动类添加EnableRedisAutoConfiguration
end !