SpringBoot自动装配原理(一)
  4yKAc8TEsf9e 2023年11月05日 35 0

基本概念

Spring Boot是一个基于Spring Framework的快速应用开发框架,它通过自动装配(Auto Configuration)实现了对Spring应用的自动化配置。自动装配能够大幅减少开发者的配置工作,提高了开发效率。

step 1.starter依赖介绍

Spring Boot的Starter是一种依赖描述符,用于封装相关功能的依赖,配置和代码,并且能够通过简单引入依赖来快速启用特定功能。Starter的目的是为了简化构建Spring应用程序的配置和依赖管理过程。 Spring Boot Starter是Spring Boot提供的一种规范和约定,定义了一种模块化的方式,可以方便地集成和启用特定功能。 我们可以遵循这种方式来创建自定义的 Starter,以下是创建 Starter 组件的步骤

创建自定义的 Starter 模块

  • 创建一个 Maven 或 Gradle 模块,命名为 spring-boot-starter-mybatis(以"spring-boot-starter-"为前缀是约定)
  • 并在该模块中添加相应的依赖,例如 MyBatis、数据库驱动等。

自动配置

  • 在自定义 Starter 模块中创建自动配置类
  • 比如 MyBatisAutoConfiguration
  • 该类负责配置 MyBatis 相关的 Bean
  • 如 SqlSessionFactory、MapperScannerConfigurer 等。

Starter 依赖管理

  • 在该模块的 pom.xml 中配置对 MyBatis、数据库驱动等的依赖。

条件化配置

  • 可以通过条件化配置,比如 @ConditionalOnClass(MyBatis.class)
  • 控制在 MyBatis 类存在时才执行相应的配置(或者其它逻辑)。

编写配置文件

  • 可以提供一个配置文件
  • 例如 application.properties 或 application.yml,用于配置 MyBatis 的属性。

发布并引用

  • 将该自定义 Starter 发布到 Maven 或其他仓库,以便其他项目可以引入。
  • 在 Spring Boot 应用程序中,通过 Maven 或 Gradle 引入自定义 Starter,例如:
<dependency>
  <groupId>com.example</groupId>
  <artifactId>spring-boot-starter-mybatis</artifactId>
  <version>1.0.0</version>
</dependency>

step 2.SpringBoot 启动

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

}

step 3.启用自动配置机制

@SpringBootApplication 是一个复合注解,如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
)
public @interface SpringBootApplication {
    ...
}

启动@EnableAutoConfiguration 开启自动配置机制

step 4.加载自动配置类

自动配置类在starter组件中被配置,如下

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisPlusProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisPlusAutoConfiguration implements InitializingBean {
    ...
}

如何找到自动配置类的位置?

  • SpringBoot约定在 Starter 组件的 META-INF/spring.factories 文件中定义
  • 该文件列出了需要自动配置的类
  • Spring Boot 在初始化时会根据这些类的定义进行自动配置。

配置类各个注解的作用

  • @Configuration
  • 声明该类是一个配置类
  • @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
  • SqlSessionFactory.classSqlSessionFactoryBean.class 是指定的类。
  • 应用程序运行时的类路径上包含这两个类中的任意一个或两个时,这个配置类才会生效。
  • 如果这两个类不在类路径上(可能你的项目代码中没有引用,或者没有引入相关的依赖),那这个配置类就不会生效
  • @ConditionalOnSingleCandidate(DataSource.class)
  • 表示只有存在一个类型为 DataSourceBean 的时候,这个配置类才会生效。
  • 这个注解通常用于避免多个 DataSource Bean 被意外地自动装配进来。
  • @EnableConfigurationProperties({MybatisPlusProperties.class})
  • 启用对指定配置类(这里是 MybatisPlusProperties)的支持。
  • 允许通过 application.propertiesapplication.yml 文件配置 MybatisPlusProperties 中的属性。
  • @AutoConfigureAfter({DataSourceAutoConfiguration.class})
  • 表示该配置类在 DataSourceAutoConfiguration 之后自动配置
  • 意味着这个配置类依赖于 DataSourceAutoConfiguration 并会在它配置完成后再配置。

至此starter组件一个宏观上的大概流程分析完毕

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
4yKAc8TEsf9e