首页 > 其他分享 >SpringBoot自动装配原理(一)

SpringBoot自动装配原理(一)

时间:2023-11-02 15:01:25浏览次数:31  
标签:装配 SpringBoot Spring 配置 Boot 自动 原理 class Starter

基本概念

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组件一个宏观上的大概流程分析完毕

标签:装配,SpringBoot,Spring,配置,Boot,自动,原理,class,Starter
From: https://blog.51cto.com/u_16079703/8147078

相关文章

  • Springboot Cache @Cacheable 类内部调用时不生效,解决办法
    出现问题的原因:Springcache的实现原理是基于AOP的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。this调用不是代理对象的调用,所以aop失效,注解失效。解决办法就是,我们获取当前Bean,由它来调......
  • springboot post请求的content-type
    content-type是http请求的响应头和请求头的字段。当作为响应头时,告诉客户端实际返回的内容的内容类型。作为请求头时(post或者put),客户端告诉服务器实际发送的数据类型。在前端开发过程中,通常需要跟后端工程师对接接口的数据格式,不同的数据类型对于服务器来说有不同的处理方式,因此......
  • springboot正常启动的时候,@Configuration的@Bean属于初始化就得加载的,当该springboot
      ......
  • SpringBoot
    1.SrpingBoot入门及原理Spring是如何简化Java开发的为了降低Java开发的复杂性,Spring采用了以下4种关键策略:基于POJO的轻量级和最小侵入性编程,所有东西都是bean;通过IOC,依赖注入(DI)和面向接口实现松耦合;基于切面(AOP)和惯例进行声明式编程;通过切面和模版减少样式代码,RedisTem......
  • gin框架curd 和java springboot crud 的比较及性能
    Gin框架与SpringBoot框架的CURD比较Ginvs.SpringBoot:简介Gin(Go语言):Gin是用于构建Web应用程序和API的轻量级、高性能框架,使用Go编程语言。它以简洁和高性能而闻名。SpringBoot(Java):SpringBoot是一个用于构建基于Java的Web应用程序的开源Java框架。它简化了使......
  • DP查缺补漏之多重背包优化原理
    DP查缺补漏之多重背包优化原理普通思路类似完全背包for(inti=1;i<=n;i++)for(intj=1;j<=V;j++)for(intk=1;k<=V/c[i];k++){if(k*c[i]<=j)f[i][j]=max(f[i-1][j],f[i-1][j-k*c[i]]+k*w[i]);......
  • android ebpf之uprobe原理和检测方法
    uprobe通过内核层对用户层进程的指定地址的原指令copy到其他位置,然后写入指定类型中断指令,然后内核中设置对应的中断处理程序,中断处理程序中执行uprobe设置的回调过滤函数,然后设置单步执行copy的原指令后恢复寄存器状态继续执行。ida查看被uprobehook的函数头部,指令被修改为了中断......
  • UnityShader入门精要第十四章-非真实感渲染原理总结
    前言开发中常常遇到的一个问题就是画面风格。接下来要介绍的就是统一修改画面风格的手段:非真实感渲染。这里同样只总结原理。非真实感渲染非真实感渲染(Non-PhotorealisticRendering,NPR)的方法来渲染游戏画面。非真实感渲染的一个主要目标是,使用一些渲染方法使得画面达到和......
  • Namenode HA原理
    1.背景在Hadoop2.0前,NameNode存在单点问题,造成服务稳定性差。Hadoop2.0后,引入HA机制,通过zk选举的方式选举active节点提供服务。在https://blog.51cto.com/u_15327484/7850359一文中,介绍过resourmanager高可用过程。NameNodeHA在选举流程上和resourmanager一致,但是,为了降低复杂......
  • ThreadLocal原理
    从ThreadLocal的get和set方法入手publicvoidset(Tvalue){Threadt=Thread.currentThread();ThreadLocalMapmap=getMap(t);if(map!=null)map.set(this,value);elsecreateMap(t,value);}......