springboot之自动装配全过程

 更新时间:2024年08月01日 09:06:51   作者:Persistence is gold  
这篇文章主要介绍了springboot之自动装配全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring Boot 实现自动装配的关键在于其自动配置机制(Auto-Configuration)和基于注解的配置。以下是 Spring Boot 实现自动装配的主要原理和步骤:

1. @SpringBootApplication 注解

@SpringBootApplication 是一个组合注解,它包含了三个重要的注解:@EnableAutoConfiguration@ComponentScan@Configuration

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。
  • @ComponentScan:启用组件扫描,以便找到带有 @Component@Service@Repository@Controller 等注解的 Spring 组件。
  • @Configuration:表明这个类是一个配置类,可以包含 @Bean 定义。

2. 自动配置(Auto-Configuration)

@EnableAutoConfiguration 注解触发自动配置。

Spring Boot 会根据类路径中的依赖、属性文件中的配置以及其他环境变量来判断并自动配置应用所需的 Bean。

自动配置的实现原理

Spring Boot 的自动配置机制依赖于 spring.factories 文件,该文件位于 META-INF 目录下。

这个文件列出了所有的自动配置类(Auto-Configuration Classes)。

例如,Spring Boot 的 spring-boot-autoconfigure JAR 包中的 spring.factories 文件部分内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
...

这些自动配置类会在 Spring 应用上下文初始化时被加载,并根据条件自动配置相应的 Bean。

3. 条件装配

自动配置类通常使用条件注解(Conditional Annotations)来控制 Bean 的装配。这些注解包括:

  • @ConditionalOnClass:只有在指定的类在类路径上存在时才会装配 Bean。
  • @ConditionalOnMissingBean:只有在指定的 Bean 不存在时才会装配 Bean。
  • @ConditionalOnProperty:只有在指定的属性存在并具有特定值时才会装配 Bean。

例如,DataSourceAutoConfiguration 类:

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        // 配置和创建 DataSource
        return properties.initializeDataSourceBuilder().build();
    }
}

4. 组件扫描(Component Scan)

@ComponentScan 注解启用组件扫描,Spring 会扫描指定包及其子包中的所有组件(带有 @Component@Service@Repository@Controller 等注解的类),并将它们注册为 Spring Bean。

@SpringBootApplication
@ComponentScan(basePackages = "com.example.myapp")
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

5. 配置类(Configuration Class)

@Configuration 注解用于定义配置类,这些类可以包含一个或多个 @Bean 方法。

每个 @Bean 方法定义了一个 Bean,并将其注册到 Spring 应用上下文中。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

6. 使用 @Autowired 注入依赖

Spring 通过 @Autowired 注解实现依赖注入。

@Autowired 可以应用于构造器、方法和字段,Spring 会自动注入相应的 Bean。

@Service
public class MyService {

    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 或者通过字段注入
    @Autowired
    private MyRepository myRepository;
}

总结

Spring Boot 通过一系列注解和条件配置实现了自动装配机制,使得开发者无需手动配置大量的 XML 文件或 Java 配置类。

自动配置机制利用 spring.factories 文件中的自动配置类,并结合条件注解和组件扫描,实现了灵活且强大的自动装配功能。

这样,开发者可以专注于业务逻辑的实现,而无需处理繁琐的配置细节。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot多环境打包与配置文件排除实践记录

    SpringBoot多环境打包与配置文件排除实践记录

    本文介绍了SpringBoot项目多环境打包与配置文件排除实践,包括多环境配置的实现方法、打包时排除配置文件的方法以及动态加载外部配置文件的最佳实践,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Java使用正则表达式进行匹配且对匹配结果逐个替换

    Java使用正则表达式进行匹配且对匹配结果逐个替换

    这篇文章主要介绍了Java使用正则表达式进行匹配且对匹配结果逐个替换,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java实现五子棋(附详细源码)

    Java实现五子棋(附详细源码)

    这篇文章主要为大家详细介绍了Java实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Java LocalDateTime转Json报错处理方案

    Java LocalDateTime转Json报错处理方案

    在使用LocalDateTime进行JSON转换时,需添加Jackson JSR310模块并配置注解,或通过自定义工具处理,解决序列化异常问题
    2025-07-07
  • 基于Java SSM实现在线点餐系统

    基于Java SSM实现在线点餐系统

    本项目基于Java SSM框架实现在线点餐系统,主要实现系统的在线点餐功能。文中的示例代码讲解详细,感兴趣的可以跟随小编一起学习一下
    2022-02-02
  • Java中线程的等待与唤醒_动力节点Java学院整理

    Java中线程的等待与唤醒_动力节点Java学院整理

    在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。下面通过本文给大家介绍Java中线程的等待与唤醒知识,感兴趣的朋友一起看看吧
    2017-05-05
  • 简单总结SpringMVC拦截器的使用方法

    简单总结SpringMVC拦截器的使用方法

    今天给大家带来的是关于SpringMVC拦截器的相关知识,文章围绕着SpringMVC拦截器的使用方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 深入理解java中的null“类型”

    深入理解java中的null“类型”

    这篇文章主要介绍了深入理解java中的null“类型”,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java使用Spring AI的10个实用技巧分享

    Java使用Spring AI的10个实用技巧分享

    在当今的软件开发领域,人工智能的集成已经成为提升应用功能和用户体验的重要手段,对于 Java 开发者而言,Spring AI 提供了一套强大且便捷的工具,本文将深入探讨 Java 使用 Spring AI 的 10 个实用技巧,感兴趣的小伙伴跟着小编一起来看看吧
    2025-06-06
  • ArrayList的自动扩充机制实例解析

    ArrayList的自动扩充机制实例解析

    本文主要介绍了ArrayList的自动扩充机制,由一个题目切入主题,逐步向大家展示了ArrayList的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10

最新评论