自定义一个spring自动配置类

项目中可以把一些自定义的类库以及第三方类库,制作自动加载类,从而实现引包即可使用的开箱即用效果。

三方库

假设有一个第三方库 paw-autoconfig-module

有一些类及服务方法

package com.paw.autoconfig.module;

// 选取一个类作为标识类
public interface ClientOption {
}

服务类

package com.paw.autoconfig.module;

// 存在一些服务类
public class SkyService {

  public String deliver(String box){
    return "delivered box "+ box;
  }
}

自动配置类

paw-autoconfig

引入三方依赖库,注意:optional true 选项

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>com.paw.demos</groupId>
    <artifactId>paw-autoconfig-module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <optional>true</optional>
  </dependency>
</dependencies>

添加配置类

package com.paw.autoconfig.module;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ClientOption.class)
public class PawModuleAutoConfiguration {

  // 定义服务bean
  @Bean
  public SkyService skyService(){
    return new SkyService();
  }

}

META-INF下添加spring.factories文件,添加自动装配引导类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.paw.autoconfig.module.PawModuleAutoConfiguration

将jar包导入到mvn 仓库

mvn clean install

使用自动装配的类

创建一个新工程 paw-auto-app

加入依赖,当不引人三方依赖paw-autoconfig-module时不进行三方服务的自动装配 skyService不能使用。

<dependencies>
    <dependency>
      <groupId>com.paw.demos</groupId>
      <artifactId>paw-autoconfig</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

  <!-- 三方依赖包 -->
    <dependency>
      <groupId>com.paw.demos</groupId>
      <artifactId>paw-autoconfig-module</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

开箱即用 自动配置的服务类

package com.paw.auto.app.controller;

import com.paw.autoconfig.module.SkyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author rubble
 * @date 2021/8/10
 **/
@RestController
public class HelloController {

  // 注入自动装配的类
  @Autowired
  SkyService skyService;

  @GetMapping("/")
  public String index(String box){
    return skyService.deliver(box) + System.currentTimeMillis();
  }

  @GetMapping("/index")
  public String index(){
    return System.currentTimeMillis()+"";
  }

}

启动服务,测试服务 访问 http://localhost:8080/?box=gift

输出 delivered box gift1628584106778 skyService 服务调用成功。

此种写法适合装配三方类库的情景。

redis本就是一个独立于spring之外的组织,springboot提供了对三方库redis的集成。

springframework是一个框架,集成了大量的三方类库,如spring-boot-xx-starter、spring-cloud-xx-starter。

对于项目中自定义starter对@ConditionalOnClass使用不多,常用@ConditionalOnProperty 使用属性来控制是否进行配置类加载,使用@ConditionalOnMissingBean提供默认bean的注入。

上一篇:SpringBoot Scheduling定时任务


下一篇:@ConditionOnClass的使用