SpringBoot基础详解

目录

SpringBoot自动配置

基于条件的自动配置

调整自动配置的顺序

[纷杂的SpringBoot Starter](#纷杂的SpringBoot Starter)

手写简单spring-boot-starter示例


SpringBoot自动配置

用一句话说自动配置:@EnableAutoConfiguration借助SpringFactoriesLoader将标准了@Configuration的JavaConfig类汇总加载到ApplicationContext。

基于条件的自动配置

在自动配置的基础上,我们可以通过@Conditional配合@Configuration或者@Bean来干预配置或者bean定义是否能够生效,类似于下面伪代码的效果:

复制代码
if(符合@Conditional规定的条件) {
    加载当前配置或者注册当前bean的定义;
}

常见的 @Conditional 注解及其作用:

  1. @ConditionalOnClass:当指定的类位于类路径上时,才加载配置的 Bean。这可用于在依赖库存在时加载 Bean。

    复制代码
    @Configuration
    @ConditionalOnClass(MyLibraryClass.class)
    public class MyConfiguration {
        // 配置 Bean
    }
  2. @ConditionalOnMissingClass :与 @ConditionalOnClass 相反,当指定的类不存在于类路径上时,才加载配置的 Bean。

    复制代码
    @Configuration
    @ConditionalOnMissingClass("com.example.SomeClass")
    public class MyConfiguration {
        // 配置 Bean
    }
  3. @ConditionalOnProperty:根据指定的配置属性是否存在,来加载 Bean。可用于在应用程序的属性文件中控制 Bean 的加载。

    复制代码
    @Configuration
    @ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
    public class MyConfiguration {
        // 配置 Bean
    }
  4. @ConditionalOnExpression:基于 SpEL 表达式的计算结果来加载 Bean。

    复制代码
    @Configuration
    @ConditionalOnExpression("${myapp.feature.enabled}")
    public class MyConfiguration {
        // 配置 Bean
    }
  5. @ConditionalOnWebApplication:当应用程序运行在 Web 环境下(例如,Spring MVC 或 Spring Boot)时,加载配置的 Bean。

    复制代码
    @Configuration
    @ConditionalOnWebApplication
    public class MyWebConfiguration {
        // 配置 Web 相关 Bean
    }
  6. @ConditionalOnJava:当运行应用程序的 Java 版本满足指定条件时,加载 Bean。

    复制代码
    @Configuration
    @ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
    public class MyJava8Configuration {
        // 配置 Java 8 相关 Bean
    }
调整自动配置的顺序

@AutoConfigureBefore和@AutoConfigureAfter是 Spring Boot 自动配置中的注解,它们用于控制自动配置类的加载顺序。这些注解允许我们明确指定自动配置类的加载顺序,以确保在加载自动配置类时符合特定的依赖关系。

以下是它们的作用和用法:

  1. @AutoConfigureBefore

    • @AutoConfigureBefore 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之前先加载指定的自动配置类。

    • 这可以用于确保在当前自动配置类之前配置某些依赖,以满足特定的应用程序需求。

    • 示例:

      复制代码
      @Configuration
      @AutoConfigureBefore(AnotherAutoConfiguration.class)
      public class MyAutoConfiguration {
          // 配置 Bean
      }
  2. @AutoConfigureAfter

    • @AutoConfigureAfter 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之后加载指定的自动配置类。

    • 这可以用于确保在当前自动配置类之后配置某些依赖,以满足特定的应用程序需求。

    • 示例:

      复制代码
      @Configuration
      @AutoConfigureAfter(AnotherAutoConfiguration.class)
      public class MyAutoConfiguration {
          // 配置 Bean
      }

纷杂的SpringBoot Starter

Spring Boot Starters 是一组官方维护的依赖关系,用于简化 Spring Boot 应用程序的配置和引导。它们旨在为特定类型的应用程序或用例提供一组默认的依赖项,以减少配置工作和提高开发效率。以下是一些常见的 Spring Boot Starters:

  1. spring-boot-starter-web:用于构建 Web 应用程序的 Starter,包括 Spring MVC、嵌入式 Servlet 容器(如Tomcat或Jetty)以及其他与 Web 相关的依赖项。适用于开发 RESTful Web 服务和传统的 Web 应用程序。

  2. spring-boot-starter-data-jpa:用于访问关系型数据库的 Starter,包括 Spring Data JPA、Hibernate 和数据源配置。适用于构建基于 JPA 的数据访问层。

  3. spring-boot-starter-data-mongodb:用于访问 MongoDB 的 Starter,包括 Spring Data MongoDB 和 MongoDB 驱动。适用于构建使用 MongoDB 的应用程序。

  4. spring-boot-starter-data-redis:用于访问 Redis 的 Starter,包括 Spring Data Redis 和 Redis 客户端。适用于构建使用 Redis 的应用程序。

  5. spring-boot-starter-data-solr:用于访问 Apache Solr 的 Starter,包括 Spring Data Solr 和 Solr 客户端。适用于构建使用 Solr 的搜索应用程序。

  6. spring-boot-starter-data-elasticsearch:用于访问 Elasticsearch 的 Starter,包括 Spring Data Elasticsearch 和 Elasticsearch 客户端。适用于构建使用 Elasticsearch 的搜索应用程序。

  7. spring-boot-starter-security:用于添加 Spring Security 支持的 Starter,包括身份验证和授权功能。适用于构建安全的应用程序。

  8. spring-boot-starter-test:用于测试 Spring Boot 应用程序的 Starter,包括JUnit、Spring Test、Mockito 和其他测试框架。适用于单元测试和集成测试。

  9. spring-boot-starter-actuator:用于添加 Spring Boot Actuator 支持的 Starter,包括监控和管理功能,如健康检查、度量、追踪等。

  10. spring-boot-starter-logging:用于日志记录的 Starter,包括 Logback、Log4j2 和其他日志框架。适用于配置应用程序的日志输出。

  11. spring-boot-starter-parent:这是一个父项目 Starter,它用于管理 Spring Boot 应用程序的依赖版本,通常作为 Spring Boot 项目的父项目引用。

  12. spring-boot-starter-xxx:除上述常见的 Starter 外,还有许多其他官方和社区维护的 Starter,如消息队列(如Kafka、RabbitMQ)、NoSQL 数据库(如Cassandra、Couchbase)等。

手写简单spring-boot-starter示例

在了解自动配置的原理后,就简单地创建一个自定义的spring-boot-starter吧。

文件目录贴一下:

  1. 创建自动配置类和需要定义的bean。

    复制代码
    @Configuration
    public class MyUserAutoConfiguration {
        @Bean
        public UserManager userManager(){
            return new UserManager();
        }
    }
    复制代码
    public class UserManager {
        public String sayHello() {
            return "own-starter:hello.";
        }
    }
  2. src/main/resources/META-INF/ 目录下创建一个 spring.factories 文件

    复制代码
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.lloyd.user.MyUserAutoConfiguration
  3. 创建一个spring-web的SpringBoot项目,添加自定义Starter的依赖。

    复制代码
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 自定义starter的坐标 -->
            <dependency>
                <groupId>com.lloyd</groupId>
                <artifactId>springboot_06_own_starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  4. 创建一个Rest接口进行验证

    复制代码
    @RestController
    public class UserController {
        @Autowired
        private UserManager userManager;
    ​
        @GetMapping("/user")
        public String sayHello(){
            return userManager.sayHello();
        }
    }

    浏览器结果:

相关推荐
可儿·四系桜5 分钟前
WebSocket:实时通信的新时代
java·网络·websocket·网络协议
forestsea5 分钟前
Maven 插件机制与生命周期管理
java·maven
七月在野,八月在宇,九月在户14 分钟前
maven 依赖冲突异常分析
java·maven
金融数据出海22 分钟前
黄金、碳排放期货市场API接口文档
java·开发语言·spring boot·后端·金融·区块链
胡斌附体27 分钟前
微服务中 本地启动 springboot 无法找到nacos配置 启动报错
java·spring boot·微服务·yml·naocs yml
薯条不要番茄酱1 小时前
【JVM】从零开始深度解析JVM
java·jvm
夏季疯1 小时前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.31)
java·笔记·学习
D_aniel_1 小时前
排序算法-快速排序
java·排序算法·快速排序
长安城没有风1 小时前
数据结构 集合类与复杂度
java·数据结构
D_aniel_1 小时前
排序算法-插入排序
java·排序算法·插入排序