---
url: https://www.dreamlu.net/mica-auto.md
---

# mica-auto

[![Java CI](https://github.com/lets-mica/mica-auto/workflows/Java%20CI/badge.svg)](https://github.com/lets-mica/mica-auto/actions)
![JAVA 8](https://img.shields.io/badge/JDK-1.8+-brightgreen.svg)
[![mica-auto Maven](https://img.shields.io/maven-central/v/net.dreamlu/mica-auto.svg?style=flat-square)](https://central.sonatype.com/artifact/net.dreamlu/mica-auto/versions)

`mica-auto` 是 `mica` 生态里的一个基础组件，用来生成 Spring Boot starter 所需的元数据配置。

它基于 **Annotation Processor**（JDK 1.6 就有的 javac 工具，Lombok 同款技术），在编译期扫描注解并自动生成配置文件，省去手写 `spring.factories` 的重复劳动。

## 🎯 使用场景

主要用来避免 Spring Boot 主项目包与`子项目`/`子模块`包不一致、导致包扫描不到的问题：

* 自定义 `spring boot starter`
* 多模块项目中的`子项目`（**不建议**主项目添加 `mica-auto`）

## ✨ 功能一览

* 自动生成 `spring.factories`、`spring-devtools.properties`
* 生成 `FeignClient` 到 `spring.factories`，供 mica-cloud 完成 Feign 自动化配置
* 生成 java SPI 配置（需添加 `@AutoService` 注解）
* 使用 `@AutoConfiguration` 时自动适配 Spring Boot 2.7+ 的 `AutoConfiguration.imports`

### 注解对照表

| 注解 | spring.factories 或 SPI key |
| ---- | --------------------------- |
| `@AutoContextInitializer` | `ApplicationContextInitializer` |
| `@AutoListener` | `ApplicationListener` |
| `@AutoRunListener` | `SpringApplicationRunListener` |
| `@AutoEnvPostProcessor` | `EnvironmentPostProcessor` |
| `@AutoFailureAnalyzer` | `FailureAnalyzer` |
| `@AutoConfigImportFilter` | `AutoConfigurationImportFilter` |
| `@AutoTemplateProvider` | `TemplateAvailabilityProvider` |
| `@AutoEnableCircuitBreaker` | `EnableCircuitBreaker` |
| `@AutoConfigDataLocationResolver` | `ConfigDataLocationResolver` |
| `@AutoConfigDataLoader` | `ConfigDataLoader` |
| `@AutoDatabaseInitializerDetector` | `DatabaseInitializerDetector` |
| `@AutoDependsOnDatabaseInitializationDetector` | `DependsOnDatabaseInitializationDetector` |
| `@Component` | `EnableAutoConfiguration` |
| `@AutoIgnore` | 忽略，不生成到 spring.factories |
| `@AutoService` | java SPI 生成配置 |

| 注解 | aot.factories |
| ---- | ------------- |
| `@AotRuntimeHintsRegistrar` | `RuntimeHintsRegistrar` |
| `@AotBeanRegistration` | `BeanRegistrationAotProcessor` |
| `@AotBeanFactoryInitialization` | `BeanFactoryInitializationAotProcessor` |

## 🔖 版本说明

| version | spring boot version | java version |
| ------- | ------------------- | ------------ |
| 4.0.1 | 4.x | 17 |
| 3.1.6 | 3.x | 17 |
| 2.3.5 | 1.x ~ 3.x | 1.8 |

## 🚀 快速开始

> `注意`：如果项目中使用了 `Lombok`，请将 `mica-auto` 的依赖放在 `Lombok` **后面**。

### Maven

```xml
<dependency>
  <groupId>net.dreamlu</groupId>
  <artifactId>mica-auto</artifactId>
  <version>${mica-auto.version}</version>
  <scope>provided</scope>
</dependency>
```

### Gradle >= 5.x

```groovy
annotationProcessor("net.dreamlu:mica-auto:${micaAutoVersion}")
```

### Gradle < 5.x

```groovy
compileOnly "net.dreamlu:mica-auto:$micaAutoVersion"
```

## 📝 使用示例

### Spring Boot starter

给类加上组合了 `@Component` 的注解（如 `@Configuration`）：

```java
/**
 * 自动配置
 *
 * @author l.cm
 */
@Configuration(proxyBeanMethods = false)
public class MicaAutoConfiguration {

	@Bean
	public SpringContextUtil springUtils() {
		return new SpringContextUtil();
	}

}
```

将自动生成 `META-INF/spring.factories`：

```text
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  net.dreamlu.mica.config.MicaAutoConfiguration
```

### java SPI

```java
package foo.bar;

import javax.annotation.processing.Processor;

@AutoService(Processor.class)
public class MyProcessor implements Processor {
    // …
}
```

将生成 `META-INF/services/javax.annotation.processing.Processor`，内容为 `foo.bar.MyProcessor`。

## 🔗 参考

* Google Auto：<https://github.com/google/auto>
* spring-context-indexer：<https://github.com/spring-projects/spring-framework/tree/main/spring-context-indexer>

## 📄 License

LGPL v3，用户权益与 mica 一致（允许以引入不改源码的形式免费使用；修改仍需遵循 LGPL 协议）。
