目录

用一句话说自动配置:@EnableAutoConfiguration借助SpringFactoriesLoader将标准了@Configuration的JavaConfig类汇总加载到ApplicationContext。
在自动配置的基础上,我们可以通过@Conditional配合@Configuration或者@Bean来干预配置或者bean定义是否能够生效,类似于下面伪代码的效果:
if(符合@Conditional规定的条件) {
加载当前配置或者注册当前bean的定义;
}
常见的 @Conditional 注解及其作用:
@ConditionalOnClass:当指定的类位于类路径上时,才加载配置的 Bean。这可用于在依赖库存在时加载 Bean。
@Configuration
@ConditionalOnClass(MyLibraryClass.class)
public class MyConfiguration {
// 配置 Bean
} @ConditionalOnMissingClass:与 @ConditionalOnClass 相反,当指定的类不存在于类路径上时,才加载配置的 Bean。
@Configuration
@ConditionalOnMissingClass("com.example.SomeClass")
public class MyConfiguration {
// 配置 Bean
} @ConditionalOnProperty:根据指定的配置属性是否存在,来加载 Bean。可用于在应用程序的属性文件中控制 Bean 的加载。
@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyConfiguration {
// 配置 Bean
} @ConditionalOnExpression:基于 SpEL 表达式的计算结果来加载 Bean。
@Configuration
@ConditionalOnExpression("${myapp.feature.enabled}")
public class MyConfiguration {
// 配置 Bean
} @ConditionalOnWebApplication:当应用程序运行在 Web 环境下(例如,Spring MVC 或 Spring Boot)时,加载配置的 Bean。
@Configuration
@ConditionalOnWebApplication
public class MyWebConfiguration {
// 配置 Web 相关 Bean
} @ConditionalOnJava:当运行应用程序的 Java 版本满足指定条件时,加载 Bean。
@Configuration
@ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
public class MyJava8Configuration {
// 配置 Java 8 相关 Bean
} @AutoConfigureBefore和@AutoConfigureAfter是 Spring Boot 自动配置中的注解,它们用于控制自动配置类的加载顺序。这些注解允许我们明确指定自动配置类的加载顺序,以确保在加载自动配置类时符合特定的依赖关系。
以下是它们的作用和用法:
@AutoConfigureBefore:
@AutoConfigureBefore 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之前先加载指定的自动配置类。
这可以用于确保在当前自动配置类之前配置某些依赖,以满足特定的应用程序需求。
示例:
@Configuration
@AutoConfigureBefore(AnotherAutoConfiguration.class)
public class MyAutoConfiguration {
// 配置 Bean
} @AutoConfigureAfter:
@AutoConfigureAfter 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之后加载指定的自动配置类。
这可以用于确保在当前自动配置类之后配置某些依赖,以满足特定的应用程序需求。
示例:
@Configuration
@AutoConfigureAfter(AnotherAutoConfiguration.class)
public class MyAutoConfiguration {
// 配置 Bean
} Spring Boot Starters 是一组官方维护的依赖关系,用于简化 Spring Boot 应用程序的配置和引导。它们旨在为特定类型的应用程序或用例提供一组默认的依赖项,以减少配置工作和提高开发效率。以下是一些常见的 Spring Boot Starters:
spring-boot-starter-web:用于构建 Web 应用程序的 Starter,包括 Spring MVC、嵌入式 Servlet 容器(如Tomcat或Jetty)以及其他与 Web 相关的依赖项。适用于开发 RESTful Web 服务和传统的 Web 应用程序。
spring-boot-starter-data-jpa:用于访问关系型数据库的 Starter,包括 Spring Data JPA、Hibernate 和数据源配置。适用于构建基于 JPA 的数据访问层。
spring-boot-starter-data-mongodb:用于访问 MongoDB 的 Starter,包括 Spring Data MongoDB 和 MongoDB 驱动。适用于构建使用 MongoDB 的应用程序。
spring-boot-starter-data-redis:用于访问 Redis 的 Starter,包括 Spring Data Redis 和 Redis 客户端。适用于构建使用 Redis 的应用程序。
spring-boot-starter-data-solr:用于访问 Apache Solr 的 Starter,包括 Spring Data Solr 和 Solr 客户端。适用于构建使用 Solr 的搜索应用程序。
spring-boot-starter-data-elasticsearch:用于访问 Elasticsearch 的 Starter,包括 Spring Data Elasticsearch 和 Elasticsearch 客户端。适用于构建使用 Elasticsearch 的搜索应用程序。
spring-boot-starter-security:用于添加 Spring Security 支持的 Starter,包括身份验证和授权功能。适用于构建安全的应用程序。
spring-boot-starter-test:用于测试 Spring Boot 应用程序的 Starter,包括JUnit、Spring Test、Mockito 和其他测试框架。适用于单元测试和集成测试。
spring-boot-starter-actuator:用于添加 Spring Boot Actuator 支持的 Starter,包括监控和管理功能,如健康检查、度量、追踪等。
spring-boot-starter-logging:用于日志记录的 Starter,包括 Logback、Log4j2 和其他日志框架。适用于配置应用程序的日志输出。
spring-boot-starter-parent:这是一个父项目 Starter,它用于管理 Spring Boot 应用程序的依赖版本,通常作为 Spring Boot 项目的父项目引用。
spring-boot-starter-xxx:除上述常见的 Starter 外,还有许多其他官方和社区维护的 Starter,如消息队列(如Kafka、RabbitMQ)、NoSQL 数据库(如Cassandra、Couchbase)等。
在了解自动配置的原理后,就简单地创建一个自定义的spring-boot-starter吧。
文件目录贴一下:

创建自动配置类和需要定义的bean。
@Configuration
public class MyUserAutoConfiguration {
@Bean
public UserManager userManager(){
return new UserManager();
}
} public class UserManager {
public String sayHello() {
return "own-starter:hello.";
}
} 在 src/main/resources/META-INF/ 目录下创建一个 spring.factories 文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.lloyd.user.MyUserAutoConfiguration
创建一个spring-web的SpringBoot项目,添加自定义Starter的依赖。
org.springframework.boot spring-boot-starter-web com.lloyd springboot_06_own_starter 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test test
创建一个Rest接口进行验证
@RestController
public class UserController {
@Autowired
private UserManager userManager;
@GetMapping("/user")
public String sayHello(){
return userManager.sayHello();
}
} 浏览器结果:
