项目中可以把一些自定义的类库以及第三方类库,制作自动加载类,从而实现引包即可使用的开箱即用效果。
三方库
假设有一个第三方库 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的注入。