自定义自动配置
Spring Boot 的核心特性之一是自动配置。它通过分析项目的依赖和类路径,自动配置 Spring 应用程序的组件,从而减少手动配置的工作量。
自动配置的工作原理
- 条件化配置:Spring Boot 使用
@Conditional
注解来判断是否应用某个配置类或 Bean。例如,@ConditionalOnClass
表示当某个类存在于类路径时,才会应用配置。 - Spring Boot Starter:每个 Starter 都包含一组依赖和自动配置类。例如,
spring-boot-starter-web
包含了 Spring MVC 和 Tomcat 的依赖。 spring.factories
文件:在META-INF/spring.factories
文件中定义了自动配置类的全限定名,Spring Boot 会加载这些配置类。
代码示例:自定义自动配置
我们可以通过编写自定义的自动配置类来扩展 Spring Boot 的功能。
1. 创建自定义 Starter
创建一个 Maven 项目,命名为 my-starter
,并添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
2. 编写自定义配置类
在 src/main/java
下创建包 com.example.mystarter
,并编写以下类:
package com.example.mystarter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass(GreetingService.class) // 当 GreetingService 类存在时生效
public class MyStarterAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 当容器中没有 GreetingService Bean 时生效
public GreetingService greetingService() {
return new GreetingService();
}
}
3. 编写服务类
创建 GreetingService
类:
package com.example.mystarter;
public class GreetingService {
public String greet() {
return "Hello from My Starter!";
}
}
4. 注册自动配置类
在 src/main/resources/META-INF
下创建 spring.factories
文件,并添加以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.mystarter.MyStarterAutoConfiguration
5.打包到本地仓库
mvn clean install
6. 使用自定义 Starter
在另一个 Spring Boot 项目中,添加 my-starter
依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>my-starter</artifactId>
<version>1.0.0</version>
</dependency>
然后在控制器中使用 GreetingService
:
package com.example.demo;
import com.example.mystarter.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@Autowired
private GreetingService greetingService;
@GetMapping("/greet")
public String greet() {
return greetingService.greet();
}
}
7. 运行并测试
启动应用,访问 http://localhost:8080/greet
,你会看到页面显示 Hello from My Starter!
。