美文网首页JAVA技术文章
spring boot : 定制自己的starter

spring boot : 定制自己的starter

作者: rejoice001 | 来源:发表于2017-12-06 10:19 被阅读49次

    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 !

    相关文章

      网友评论

        本文标题:spring boot : 定制自己的starter

        本文链接:https://www.haomeiwen.com/subject/gfkkixtx.html