spring boot : 定制自己的starter

来源:互联网 发布:人傻 知乎 编辑:程序博客网 时间:2024/04/20 10:17

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已经编写完毕

3、项目中使用自己定义的starter

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

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

    



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

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

其实道理都是一样的

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

   第一步:编写RedisAutoConfiguration,跟之前

   第二步:编写pom文件,跟之前不同的是这里不需要加optional,直接引入依赖,从而省略了官方的starter

   第三步:编写EnableRedisAutoConfiguration注解

       @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RedisAutoConfiguration.class)
public @interface EnableRedisAutoConfiguration{

  

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

  

   使用:1、添加依赖redis-company-autoconfigure

                2、启动类添加EnableRedisAutoConfiguration



end !


    


0 1
原创粉丝点击