一、spring boot 自动装配机制
自动装配是 spring boot 的核心特性之一,它极大地简化了基于 spring 的应用开发,减少了繁琐的 xml 配置或 java 配置。其核心思想是“约定优于配置”(convention over configuration)。
1. 核心原理:@enableautoconfiguration
spring boot 的启动类通常带有 @springbootapplication 注解,它是一个组合注解,包含以下关键注解:
@springbootconfiguration @enableautoconfiguration @componentscan
其中 @enableautoconfiguration 是开启自动装配的关键。
2. 自动配置的实现方式
条件化配置(conditional): 通过 @conditional 系列注解(如 @conditionalonclass, @conditionalonmissingbean 等)判断是否满足加载条件。
例如:
@configuration
@conditionalonclass(datasource.class)
public class datasourceautoconfiguration {
@bean
@conditionalonmissingbean
public datasource datasource() {
// 自动配置数据源
}
}spring.factories 文件: 在 meta-inf/spring.factories 文件中声明需要自动加载的配置类:
org.springframework.boot.autoconfigure.enableautoconfiguration=\ com.example.myautoconfiguration
spring boot 启动时会扫描所有 jar 包中的该文件,并加载其中配置的类。
3. 自动装配流程
- 启动
springapplication - 加载
meta-inf/spring.factories中的enableautoconfiguration列表 - 过滤掉被
@conditional排除的配置类 - 将剩余的配置类注入 spring 容器
二、starter 实现原理
starter 是 spring boot 生态中的重要概念,它是一个“开箱即用”的依赖模块,通常包含:
- 必要的库依赖(
pom.xml) - 自动配置类(
xxxautoconfiguration) - 可选的附加配置(如
application.properties默认值)
1. 自定义 starter 步骤
步骤 1:创建项目结构
my-starter ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ ├── myservice.java // 服务类 │ │ │ └── auto │ │ │ └── myautoconfiguration.java // 自动配置 │ │ └── resources │ │ └── meta-inf │ │ └── spring.factories // 注册自动配置 └── pom.xml
步骤 2:实现自动配置类
@configuration
@conditionalonclass(myservice.class)
public class myautoconfiguration {
@bean
@conditionalonmissingbean
public myservice myservice() {
return new myservice();
}
}步骤 3:注册配置到 spring.factories
org.springframework.boot.autoconfigure.enableautoconfiguration=\ com.example.auto.myautoconfiguration
步骤 4:打包发布
<!-- pom.xml 示例 -->
<artifactid>my-spring-boot-starter</artifactid>
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-autoconfigure</artifactid>
</dependency>
</dependencies>三、自动装配与 starter 的关系
- starter 提供依赖管理和默认配置入口
- 自动配置 基于 starter 引入的依赖实现条件化装配
- 用户只需引入 starter 依赖即可获得完整功能
四、示例:自定义 starter 使用
// 用户项目中直接注入服务
@restcontroller
public class democontroller {
@autowired
private myservice myservice; // 自动注入 starter 提供的 bean
@getmapping("/demo")
public string demo() {
return myservice.execute();
}
}总结
| 概念 | 作用 | 关键实现 |
|---|---|---|
| 自动装配 | 按条件动态加载配置 | @conditional, spring.factories |
| starter | 依赖聚合 + 默认配置 | pom.xml + 自动配置类 |
通过这种机制,spring boot 实现了“约定大于配置”的理念,开发者只需关注业务逻辑,大大提升了开发效率。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论