springBoot 自动配置与starter

目录

一、自动配置

Springboot实现自动配置的核心机制

@Conditional的作用是什么?

如何自定义自动配置?

步骤

例子分析

自动配置的优先级

如何禁用特定的自动配置?

二、starter

[如何理解Spring Boot中的starter?](#如何理解Spring Boot中的starter?)

如何自定义starter?

[三、自动配置和 Starter 的关系和区别?](#三、自动配置和 Starter 的关系和区别?)


一、自动配置

Springboot实现自动配置的核心机制

1)自动配置是通过 @EnableAutoConfiguration 注解实现的。

这个注解位于@SpringBootApplication 中。换句话说,@SpringBootApplication实际上包含了@EnableAutoConfiguration,从而启用了自动配置功能。

通过 @import 注解导入 AtuoConfigurationlmportSelector 类, 会通过扫描类路径中的依赖,根据应用的上下文自动加载配置类,并为应用自动注入合适的Bean。

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

2)spring.factories 文件

Spring Boot 的自动配置依赖于META-INF/Spring.factories 文件(文件里定义了所有的自动配置类)。

springboot启动时,它会根据 spring.factories 文件中指定的配置类加载相应的自动配置。

java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

3)条件注解(Conditional)

自动配置类通常使用@Conditionalonclass、@@ConditionalonMissingBean、@ConditionalonProperty等条件注解。

它们控制自动配置的加载条件,例如,仅在类路径中存在某个类时才加载某些配置。

java 复制代码
@Configuration
@ConditionalOnClass(DataSource.class)  // 只有类路径中存在 DataSource 时才生效
public class DataSourceAutoConfiguration {
   @Bean
   @ConditionalOnMissingBean  // 如果没有自定义 DataSource,则使用默认配置
   public DataSource dataSource() {
       return new HikariDataSource();
   }
}

@Conditional的作用是什么?

作用于有条件地装配Bean。可以根据特定的条件来决定某个Bean是否应该被加载到 Spring 容器中。

主要作用:

  • 有条件地加载 Bean:@Conditional 根据某个条件来决定某个 Bean 是否需要注入到 Spring 容器中。条件可以是操作系统类型、类路径是否存在某个类、某个属性的值等。
  • 实现动态配置:可以根据环境(如开发、测试、生产)或特定上下文条件动态装配Bean,避免不必要的Bean被加载。

使用场景:

  • 在不同的操作系统或环境中注入不同的Bean。
  • 根据应用程序的配置文件、属性值来动态启用某些功能。
  • 在条件满足时,才装配某些依赖或服务。

如何自定义自动配置?

步骤

1)创建自动配置类

自定义自动配置类需要标注**@Configuration注解**,同时可以使用各种条件注解控制配置的加载。

java 复制代码
@Configuration
@ConditionalOnClass(MyCustomService.class)
public class MyCustomAutoConfiguration {

   @Bean
   @ConditionalOnMissingBean
   public MyCustomService myCustomService() {
       return new MyCustomService();
   }
}

2)配置spring.factories文件

创建 META-INF/spring.factories 文件,并将自定义的自动配置类注册到EnableAutoConfiguration 中。

java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyCustomAutoConfiguration

3)打包并发布

自定义的自动配置类可以随应用一起打包,也可以打包成库供其他应用使用。当这个库被引入到其他Spring Boot应用时,自动配置就会生效。

例子分析

这段代码是用于Spring Boot框架的自动配置类。下面是对代码的具体分析:

@Configuration注解:是一个Spring框架的注解,表示该类是一个配置类,其中包含了一个或多个@Bean定义的方法。这些方法返回的对象会被注册为Spring容器中的bean。

@ConditionalOnClass(MyCustomService.class)条件注解:表示只有当类路径下存在MyCustomService类时,这个配置类才会被加载。这是一种常见的用于控制配置是否生效的手段。

@Bean注解:表明这个方法将返回一个对象,该对象会被注册到Spring IoC容器中作为bean。

@ConditionalOnMissingBean注解:表示只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。这可以避免在已有配置的情况下重复创建相同的bean。

定义一个MyCustomAutoConfiguration的公共类,通过@Configuration注解表示该类是一个自动配置类。通过@ConditionalOnClass(MyCustomService.class)条件注解,设置当该配置类路径下存在MyCustomService类时,该配置类才会被加载。

然后,@Bean和@ConditionalOnMissingBean这两个注解共同作用于myCustomService()方法上。只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。return new MyCustomService();表示返回一个新的MyCustomService实例,并将其注入到Spring容器中。

在/spring.factories 文件中,org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.config.MyCustomAutoConfiguration这行代码是Spring Boot自动配置的一部分,它告诉Spring Boot在启动过程中自动加载 MyCustomAutoConfiguration 配置类。

总结来说,这段代码定义了一个自动配置类,用于在满足特定条件时(即存在MyCustomService类且当前容器中没有同类型bean时),自动创建并注册一个MyCustomService bean到Spring容器中。这种方式简化了开发者的工作,使得应用可以根据项目实际情况自动调整。

自动配置的优先级

Spring Boot 提供了控制自动配置顺序的机制:可以通过@AutoConfigureBefore 和@AutoConfigureAfter注解,来指定自动配置类的加载顺序。

  • @AutoConfigureBefore:让当前配置类在指定的配置类之前加载。
  • @AutoConfigureAfter:让当前配置类在指定的配置类之后加载。
java 复制代码
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class MyDataSourceAutoConfiguration {
    // 自定义的数据源配置
}

这段代码定义了一个自定义的自动配置类MyDataSourceAutoConfiguration,用于在Spring Boot应用程序中进行数据源配置。下面是详细的分析:

首先,通过@Configuration注解表明这是一个配置类,意味着这个类包含了使用@Bean注解的方法,这些方法会生成Spring管理的bean。

然后,@AutoConfigureBefore(DataSourceAutoConfiguration.class)注解指定了此配置类应该在DataSourceAutoConfiguration之前被处理。其中, DataSourceAutoConfiguration是Spring Boot提供的一个自动配置类,用于配置数据源。通过这种方式,就可以确保这个自定义数据源配置优先于Spring Boot默认的数据源配置。

然后,就可以在类里自定义的数据源配置,代码中没有写具体的配置内容。

如何禁用特定的自动配置?

在某些情况下,SpringBoot的默认自动配置可能与业务需求不符,可以通过以下方式禁用不需要的自动配置类。

1)在 application.properties 中禁用

java 复制代码
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

spring.autoconfigure.exclude是一个配置属性,可以在application.propertiesapplication.yml文件中设置,用来排除指定的自动配置类。

2)使用@SpringBootApplication注解的exclude属性

java 复制代码
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
   public static void main(String[] args) {
       SpringApplication.run(MyApplication.class, args);
   }
}

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})注解组合了@Configuration、@EnableAutoConfiguration和@ComponentScan。

注解里的exclude属性用于明确地排除指定的自动配置类,DataSourceAutoConfiguration就是被排除的配置类。

二、starter

如何理解Spring Boot中的starter?

starter就是一组依赖的集合,引l入一个starter就相当于引入了这一组依赖,简化依赖管理。

比如:spring-boot-starter-web 包含了json、tomcat、spring-webmvc等多个依赖。

java 复制代码
<dependencies>
    <!-- 使用 starter 管理依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- 使用 starter 进行数据访问 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-web这个依赖项包含了Web应用开发所需的所有依赖,包括Spring MVC、嵌入式Tomcat服务器、JSON支持等。它简化了Web应用的依赖管理,开发者只需添加这一行依赖即可拥有完整的Web开发环境。

spring-boot-starter-data-jpa这个依赖项包含了JPA(Java Persistence API)相关的所有依赖,包括Spring Data JPA、Hibernate、数据库驱动等。它简化了数据访问层的依赖管理,开发者只需添加这一行依赖即可拥有完整的JPA支持。

如何自定义starter?

1)创建自动配置类:选择将哪些对象(比如连接客户端)注入到Spring容器中。

java 复制代码
@Configuration
public class JedisAutoConfiguration {
    @Bean
    public MyService myService(JedisProperties properties) {
        return new Jedis(properties);
    }
}

2)创建属性类:加载使用者自定义的属性进来(username、password)。

java 复制代码
@ConfigurationProperties("jedis")
public class JedisProperties {
    private String username;
    private String password;
}

3)创建spring.factories文件:即使用者的Spring容器初始化时,会将我们的自动配置类加载进去。

java 复制代码
在resources/META-INF目录下创建spring.factories文件,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.JedisAutoConfiguration

4)引入我们自定义的starter依赖。

三、自动配置和 Starter 的关系和区别?

Spring Boot 的自动配置和 Starter 之间有密切的关系,但它们的功能和用途有所不同。下面详细介绍这两者之间的关系和区别。

1)定义

自动配置是 Spring Boot 的核心特性之一,它根据类路径上的依赖和配置属性自动配置应用。自动配置的目标是尽可能减少开发者的手动配置工作。

而Starter 是一组依赖管理工具,简化了 Spring Boot 应用程序的依赖管理。Starter 提供了一组相关的依赖项,使开发者更容易地引入和管理所需的库。

2)关系

依赖关系 :自动配置依赖于 starter 来引入所需的依赖项。例如,spring-boot-starter-data-jpa 包含了 JPA 相关的依赖,而自动配置则利用这些依赖来配置 JPA 相关的组件。

互补关系:Starter 提供了依赖管理,而自动配置则提供了基于这些依赖的自动化配置。

3)区别

目的不同

  • 自动配置的目的是减少手动配置工作,提高开发效率。
  • Starter 的目的是简化依赖管理,减少项目构建文件中的冗余配置。

应用场景不同

  • 自动配置适用于希望快速启动并运行应用的场景,尤其是在没有太多自定义需求的情况下。
  • Starter 适用于希望简化项目依赖管理和版本控制的场景。

总结一下,自动配置是通过条件注解和依赖检测自动配置应用组件。Starter是用来简化依赖管理,提供一组相关的依赖项。两者结合使用,可以显著提高开发效率,减少配置工作量。

相关推荐
Oneforlove_twoforjob11 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
engchina27 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it28 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行30 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
诚丞成1 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6661 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024061 小时前
SQL MID()
开发语言
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶1 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室1 小时前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript