SpringBoot自动配置原理

Spring Boot 自动配置实现原理(源码分析) 这里我们只简单贴出两个重点方法,process 方法和 selectImports 方法,我们在 process 方法中看到了 AutoConfigurationImportSelector#getAutoConfigurationEntry 方法,这个方法在项目启动时候是调用了的,因此我们可以进一步猜测,项目启动的时候是调用了 AutoConfigurationImportSelector.AutoConfigurationGroup#process 方法。下面我们从源码层面去剖析。 阅读详情

SpringBoot开始

1.1、依赖管理

  • 父项目做依赖管理
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
</parent>

spring-boot-starter-parent的父项目是spring-boot-dependencies可以看看里面有哪些东西

spring-boot-dependencies几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制

  • 启动器

    1、见到很多 spring-boot-starter-* : *就某种场景
    2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
    3、SpringBoot所有支持的场景
    https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
    4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
    5、所有场景启动器最底层的依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.4.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    
  • 无需关注版本

    1、引入依赖默认都可以不写版本
    2、引入非版本仲裁的jar,要写版本号。

    3、修改默认版本号 :

    1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
    2、在当前项目里面重写配置
        <properties>
            <mysql.version>5.1.43</mysql.version>
        </properties>
    

1.2、自动配置

以web项目为例

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

这个启动器配置了:

  • Tomcat

  • SpringMVC

  • Web常见功能,如:字符编码问题

  • 默认的包结构、

    • 主程序(主方法所在类)所在包及其下面的所有子包里面的组件都会被默认扫描进来
    • 无需以前的包扫描配置
    • 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.atguigu”)
      • 或者@ComponentScan 指定扫描路径
  • @SpringBootApplication
    等同于
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan("com.chr.boot")
    public class MainApplication {
        public static void main(String[] args) {
          ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);  
        }
    }
    
  • 各种配置拥有默认值

    • 默认配置最终都是映射到某个类上,如:MultipartProperties
    • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项

    • 非常多的starter
    • 引入了哪些场景这个场景的自动配置才会开启
    • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

容器功能

2.1、组件添加

1、@Configuration配合@Bean

  • 基本使用
  • Full模式与Lite模式
    • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
    • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 * 2、配置类本身也是组件
 * 3、proxyBeanMethods:代理bean的方法
 *      Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 *      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 *      组件依赖必须使用Full模式默认。其他默认是否Lite模式
 *
 *
 *
 */
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }

    @Bean("tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

2、@ComponenScan

在组件类上@Component、@Controller、@Service、@Repository

3、@Import

  • 位置放在配置类上
@Import({User.class, DBHelper.class})
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}

@Import 高级用法: https://www.bilibili.com/video/BV1gW411W7wy?p=8

4、@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入

  • 加在配置类上代表该配置类加载所有组件时都需要这个条件
  • 也可加在返回组件的方法上,只控制一个组件的
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {
}

2.2、原生配置文件引入

1、@ImportResource

将beans.xml(spring配置文件)里面的组件通过@ImportResource("classpath:beans.xml")加载

2.3、配置绑定

application.properties配置文件存放某些组件需要的属性

1、@ConfigurationProperties

在给Car类的属性赋值时只需要在application.properties配置文件中配置mycar.brand=xxx;mycar.price=xxx即可

/**
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {

    private String brand;
    private Integer price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

2、@EnableConfigurationProperties + @ConfigurationProperties

  • 一般使用这种方式
@EnableConfigurationProperties(Car.class) // 开启 Car 的属性配置并自动注入到容器中
public class MyConfiguration {
}
@ConfigurationProperties(prefix = "car")
public class Car {}

3、@Component + @ConfigurationProperties

@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}

自动配置原理入门

官方starter一般为 spring-boot-starter-xxx

第三方starter一般为 xxx-spring-boot-starter

starter的自动配置过程

通过自定义starter来理解自动配置

  • xxx-starter工程(普通工程)引入xxx-starter-autoconfigure工程(是一个springboot工程)–>

  • 包含xxxAutoConfiguration类(会在工程启动时被读取),且该配置类通过@EnableConfigurationProperties(xxxproperties.class)注解

    @Configuration
    // 绑定配置文件的配置(组件所需要的属性可以配置在bean类中,bean类通过读取配置文件来获取值)
    @EnableConfigurationProperties(HelloServiceProperties.class)
    public class HelloServiceAutoConfiguration {
    	// 向容器加载组件
        @Bean
        @ConditionalOnMissingBean(HelloService.class)
        public HelloService helloService(){
            return new HelloService();
        }
    }
    
  • 绑定一个xxxproperties的bean类,改bean类又通过@ConfigurationProperties(String prefix)和配置文件的值进行绑定

    @ConfigurationProperties("hello")
    public class HelloServiceProperties {
        String prefix;
        String suffix;
       // getter、setter...
    }
    
  • 最后通过将xxx-starter-autoconfigure的配置类的全类名放在配置文件classpath:META-INF/spring.factories即src/main/resources/META_INF/spring.factories的``org.springframework.boot.autoconfigure.EnableAutoConfiguration=/`中。

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.chr.hello.auto.HelloServiceAutoConfiguration
    

这样配置类就会在项目启动时通过读取所有的spring.factories文件中的配置类将其加载在容器中,配置类中的各种组件也随之被加载到了容器。

PLSQL 14.0.6 下载使用教程 众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下, 阅读详情

相关推荐

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 278

SpringBoot】理解Spring Boot自动配置的底层原理

在前文中,我们介绍了如何通过实现Condition接口并重写matches()方法来创建自定义条件类。Spring Boot自动配置也是基于类似的条件机制。例如,Spring Boot自动配置类会根据环境变量、类路径中的类以及现有的Bean来决定是否进行配置。@Override@Bean创建META-INF目录:在资源目录下(src/main/resources),创建META-INF目录。

Mia惠枫的博客 1942

three VR 全景跳转(完整源码+说明)(参考贝壳找房全景看房).zip

【资源说明】1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!

SpringBoot 自动配置原理

SpringBoot自动配置是指Spring Boot能够根据项目中添加的依赖、配置文件和类路径下的类自动配置Spring应用程序,极大地简化开发者的配置工作,提高开发效率。SpringBoot自动配置是通过注解实现的,它会自动根据你添加的jar依赖来配置你的Spring应用。需求:自定义,要求当导入redis坐标时,SpringBoot自动创建Jedis的Bean参考:可以参考mybatis启动类的应用实现步骤:(1)创建。

indiansummer_的博客 3736

springboot自动配置原理

springboot自动配置原理

SO_zxn的博客 816

【深入浅出SpringBoot】了解Spring Boot自动配置原理

前言 为什么我们要用 Spring BootSpring Boot 最重要的功能是:自动配置。 为什么说是自动配置?先看@SpringBootApplication注解的源码。 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Spr...

SmallCatBaby的博客 1085

Springboot自动配置原理(简单全面)

SpringBoot自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。比如:我们要进行事务管理、要进行AOP程序的开发,此时就不需要我们再去手动的声明这些bean对象了,我们直接使用就可以从而大大的简化程序的开发,省去了繁琐的配置操作。

qq_51468665的博客 6055

Springboot自动配置原理

Springboot自动配置原理

qq_45443475的博客 955

SpringBoot自动配置原理

自动配置是指应用程序在启动时,SpringBoot根据classpath类路径下的jar包自动配置应用程序所需的一系列bean组件,从而减少开发者的配置工作,提高开发效率。简单来说就是用注解来对一些常规的配置做默认配置,简化xml配置内容,使项目能够快速运行。

qq_72566172的博客 1364

这样讲 SpringBoot 自动配置原理,你应该能明白了吧

前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题,各种排除扫描,导入一个新的依赖又得添加新的配置。自从有了 SpringBoot 之后,咋们就起飞了!各种零配置开箱即用,而我们之所以开发起来能够这么爽,自动配置的功劳少不了,今天我们就一起来讨论一下 SpringBoot 自动配置原理。 本文主要分为三大部分: SpringBoot 源...

dearKundy的博客 5571

SpringBoot学习路径二--Spring Boot自动配置原理深度解析

创建文件定义自己的自动配置类使用合适的条件注解@Bean在SPI机制:通过实现扩展点加载条件评估:通过Condition接口实现条件化配置延迟加载:通过实现配置类的延迟处理配置优先级:通过和@Order控制配置顺序Spring Boot自动配置机制通过这种灵活的条件化方式,既保证了"约定优于配置"的便利性,又提供了足够的灵活性来覆盖默认行为。

2403_87486006的博客 1340

springboot自动配置_spring boot自动配置原理

“ 还记得我们怎么配置文件的吗,里面可以写啥,怎么写。这么多,估计没几个人能够背下来,那么怎么才能知道这个东西怎么写呢?今天就来谈谈配置的终极奥秘——自动配置原理!!!”自动配置原理 我们首先来看看启动类,从这个入口开始,一步一步的究其源码。在我们的spring boot应用启动的时候,我们是直接运行main方法,而这个main方法有一个注解@SpringBootApplication,...

weixin_39643244的博客 154

springBoot自动配置原理

一、自动装配是什么? 自动装配就是spring容器启动后,一些自动配置类就自动装配的IOC容器中,不需要我们手动去注入。 二、自动配置原理 SPI:是server provider interface 的简写,字面意思是服务发现接口,我理解就是第三方拓展API,他是java提出的,即开箱即用的思想。在spring的生态中已经运用得非常多,比如springMVC中官方推荐的去web.xml的方式,用一个onStart的方法就将dispatcherServlet到IOC的容器中,这也是利用了tomcat的SPI

m0_51167384的博客 1万+

springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理

通过前面章节的学习,我们掌握了使用Spring Boot框架进行实际应用开发的方法。在使用Spring Boot 的过程中,我们时常会为一些看似简单,但实际上蕴藏了强大功能的实现而惊呼,下面就让我们来揭开它的神秘面纱,做到知其然,进而知其所以然。在认识Spring Boot 的实现原理之后,我们在使用某些功能时,就能够做到心中有数,从而更好地使用它。1 Spring Boot主程序的功能代码清单1...

weixin_39737233的博客 86
上一篇: java字符串值传递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值