SpringBoot2自动装配原理解析

目录
  • 1、SpringBoot特点
    • 1.1依赖管理
    • 1.2自动配置
  • 2、容器功能
    • 2.1组件添加
    • 1、@Configuration
    • 2、@Bean、@Component、@Controller、@Service、@Repository
    • 3、@ComponentScan、@Import
    • 4、@Conditional
    • 2.2、原生配置引入@ImportResource
    • 2.3配置绑定
    • 1、@ConfigurationProperties
  • 3、自动配置原理入门
    • 3.1引导加载自动配置类
    • 3.2按需开启自动匹配项
    • 3.3修改默认配置
    • 3.4配置流程
  • 4、开发工具
    • 4.1lombok
    • 4.2dev-tools
    • 4.3SpringInitailizr(项目初始化向导)

1、SpringBoot特点

1.1 依赖管理

父项目做依赖管理

springboot项目的父项目
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
</parent>

spring-boot-starter-parent的父项目
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
  </parent>

父项目整合了所有开发中常用的依赖的版本号,称为自动版本仲裁机制。

注意:这不是说无需导入依赖了,而是指在导入依赖的时候,会自动仲裁(匹配)版本号,相当于模具的功能。

开发导入starter场景启动器

场景启动器的功能是:springboot已经帮我们整合了所有应用场景常规的依赖,只要依赖中写入某场景启动器,之下的所有依赖也都一一导入了。

  • 官方整合的场景启动器一般是:spring-boot-starter-*。
  • 只要引入starter,这个场景的所有常规需要的依赖都会自动引入。
  • SpringBoot所有支持的场景都在:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter 这个地址里。
  • 第三方提供的简化开发的场景启动器一般是:*-spring-boot-starter
  • 所有场景启动器都有一个最底层的依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.3.4.RELEASE</version>
  <scope>compile</scope>
</dependency>

自动版本仲裁机制

意味着无需关注版本号,即导即用。

注意:

引入父项目中已经整合过的依赖,都可以不写版本号。

但引入没有版本仲裁的jar,需要写版本号。

如果对整合过的依赖的版本号不满意,可以修改默认的版本号,方法如下:

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

1.2 自动配置

springboot已经配置好了那些繁文缛节的配置文件,不用我们额外的配置

比如:

1、Tomcat

2、SpringMVC(引入了全套组件、常用的功能)DispathcherServlet等

3、Web常见功能:字节编码,内部视图解析器

4、默认的扫描包结构

  • 之前我们在方法上加注释,需要在配置文件中扫描包名等,现在已经不需要了。
  • 主程序Application所在包及其子包里面的组件都会被默认扫描进来
  • 如果想要改变扫描路径,可以在主程序上的springboot声明注解中设置scanBasePackages属性
@SpringBootApplication(scanBasePackages="com.atguigu")
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

5、各种配置拥有默认值

如果需要更改默认值,可以在resource文件下创建application.properties,修改其中的默认值

默认配置的原理:

  • 默认配置最终都是映射到某个类上,如:MultipartProperties
  • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
  • 引入了哪些场景这个场景的自动配置才会开启
  • SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里面

2、容器功能

2.1 组件添加

1、@Configuration

/**
 *  1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 *  2、配置类本身也是组件
 *  3、proxyBeanMethods = true 默认是true 表示代理bean的方法 (动态代理)
 *    Full模式(proxyBeanMethods = true)
 *    Lite模式(proxyBeanMethods = false)
 *    组件依赖
 */
@Configuration(proxyBeanMethods = true)  //告诉SpringBoot这是一个配置类 == xml配置文件
public class MyConfig {

    /**
     * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */
    //给容器中添加组件,相当于bean标签,以方法名作为组件的id。 返回类型是组件类型,返回值就是组件在容器中的实例。
    @Bean
    public User user01(){
        return new User("zhangsan",18);
    }
    // 如果不想用方法名作为组件的id 可以修改Bean中的value属性,自定义组件id
    @Bean("tom") //此时组件id就不再是tomcatPet,而是tom
    public Pet tomcatPet(){
        return new Pet("tomcat");
}

Full模式和Lite模式(新版本增加)

配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断

配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

2、@Bean、@Component、@Controller、@Service、@Repository

这些注解与Spring中学习的作用一致,不再解释。

3、@ComponentScan、@Import

ComponentScan是组件扫描的意思。

@Import()

Import注解后面填的是类的数组,作用是给容器中自动创建出这两个类型的组件、且默认组件的名字是全包名。

(可以与@Bean方法创建出的组件是方法名相对比)。

4、@Conditional

条件装配

@ConditionalOnBean(name = "tom")

此注释表示:只有在IOC容器中有tom名称的类才将这个注释挂载的类/方法注册。

2.2、原生配置引入@ImportResource

在一些老的项目或者第三方包引入的时候,很可能还是采用老版的xml方式注册组件,可以在任一配置类上加上此注解,导入xml的地址就可以引入。

使用方式:

1、首先创建xml配置文件,写入一个bean

<bean id="user02" class="com.atguigu.boot.bean.User">
        <property name="age" value="20"/>
        <property name="name" value="xcc"/>
 </bean>

2、在任意一个配置类上加上@ImportResource注解

@ImportResource("classpath:beans.xml")
public class MyConfig {
}

2.3 配置绑定

1、@ConfigurationProperties

一些需要抽离的会改变的配置,之前会以properties文件的形式存储,然后通过读取文件,来放入javabean中,但是该注解不必如此麻烦。

只要将需要配置的类加入容器中,再使用@ConfigurationProperties注解,就能够自动将applicaton.properties文件中的属性注入该类。

使用步骤:

1、创建实体类,然后加上@Component注解,将该类注册进容器中。

2、使用@ConfigurationProperties注解,prefix的含义是,所有mycar开头的属性就是要注入的配置内容。

/**
 * 只有在容器中的组件,才会拥有springboot的强大功能
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    //一些属性get、set方法云云
}

3、在application.properties中配置需要注入的属性

mycar.brand = BYD
mycar.price = 100000

注意:如果该类是引入包里的类,不方便直接在要注入的类上加注释

可以在配置文件中如此声明

@EnableConfigurationProperties(Car.class)

该注释的作用有2个:

1、开启配置绑定功能。

2、把组件自动注册到容器中。

3、自动配置原理入门

3.1 引导加载自动配置类

为什么springboot可以不用我们使用xml文件(仅使用Bean)就可以向容器中注册组件?

原因在于springboot主程序下的声明注解:

  @SpringBootApplication

该注解由3个注解复合而成:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@SpringBootConfiguration:

这个注解其实就是一个Configuration注解,声明主程序也是一个特殊的配置类。

@ComponentScan

这个注解起到了扫描包的作用,指定扫描包的路径

@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

1、@AutoConfigurationPackage

自动配置包,点进去可以看到:

@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
public @interface AutoConfigurationPackage {}

//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

首先Import导入了一个组件,然后这个组件的功能是用来注册扫描的包下所有的组件。

2、@Import(AutoConfigurationImportSelector.class)

有选择的自动配置一些组件。

1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

总的来说:springboot将所有环境的配置全部写在了一个一个工厂的配置文件里。

3.2 按需开启自动匹配项

127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
原理:按照条件装配规则(@Conditional),将选择的配置加载。

3.3 修改默认配置

@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}

给容器中加入了文件上传解析器;

springboot帮我们底层封装了一个注解方法,将不符合规范的命名也更正了。

SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先。

*******总结********:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
  • 用户直接自己@Bean替换底层的组件
  • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties  

3.4 配置流程

4、开发工具

4.1 lombok

lombok可以简化javabean的编写。

当我们创建javabean类的时候,总要编写其getset方法,toString方法、有参无参构造器,很烦而且代码很多不清晰。

可以加lombok注解简化编写。

使用前提:

1、添加lombok的依赖。

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

2、在插件市场安装lombok插件。

使用说明:

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
    private String name;

}

@Data:自动编写其get/set方法。

@ToString:自动重写其toString方法。

@NoArgsConstructor:编写无参构造器。

@AllArgsConstructor:编写有参构造器。需要注意的是,有参构造器默认是将所有的参数都构造,如果要想限定个数个参数构造,还是需要自己写。

@Slf4j:日志注解。可以通过log.info在控制台打印消息。

4.2 dev-tools

热更新,在修改了方法或页面时,只需要用dev-tools(Ctrl+F9)就行重新编译,速度要比重启项目快一些

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

4.3 Spring Initailizr(项目初始化向导)

在创建项目的时候,只需要勾选环境,就会自动帮我们搭建项目所需要的环境。

所以我们只需要关注项目本身的代码。

到此这篇关于SpringBoot2自动装配原理的文章就介绍到这了,更多相关SpringBoot2自动装配内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot自动装配Condition的实现方式

    目录 1. 简介 2. 定义 2.1 @Conditional 2.2 Condition 3. 使用说明 3.1 创建项目 3.2 测试 3.3 小结 4. 改进 4.1 创建注解 4.2 修改UserCondition 5. Spring内置条件注解 1. 简介 @Conditional注解在Spring4.0中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean. 2. 定义 2.1 @Conditional @Conditional注解定义如下:其内部只有一个参数

  • springboot 无法自动装配的问题

    目录 springboot 无法自动装配 @Autowired 报错:无法自动装配 基本上是因为 放到org.example下,问题解决 原因 无法自动装配.未找到“xxxMapper”类型的bean 说明Spring框架没有识别到你的xxxMapper中的类 如果你得类不需要管理或者继承或实现一些规则 springboot 无法自动装配 @Autowired 报错:无法自动装配 基本上是因为 1.项目里有类似mybatis @Mapper这种第三方映射类,需要用到springboot auto

  • 浅析SpringBoot自动装配的实现

    目录 背景 解析 起始 具体解析 结论 备注 背景 众所周知,如下即可启动一个最简单的Spring应用.查看@SpringBootApplication注解的源码,发现这个注解上有一个重要的注解@EnableAutoConfiguration,而这个注解就是SpringBoot实现自动装配的基础 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spri

  • 浅谈springboot自动装配原理

    一.SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFi

  • SpringBoot(cloud)自动装配bean找不到类型的问题

    目录 SpringBoot自动装配bean找不到类型 今天我就犯了因为boot扫不到包的问题 看项目结构 很明显 无法自动装配.未找到“xxxMapper”类型的bean SpringBoot自动装配bean找不到类型 Spring基于注解的@Autowired是比较常用的自动装配注解,但是会因为个人的疏忽,SSM进行配置的时候没有将对应bean所在包给扫描进去:或者使用Boot的时候,没有放在启动类所在包及其子包下导致报错. 今天我就犯了因为boot扫不到包的问题 Description: F

  • SpringBoot自动装配原理详解

    首先对于一个SpringBoot工程来说,最明显的标志的就是 @SpringBootApplication它标记了这是一个SpringBoot工程,所以今天的 SpringBoot自动装配原理也就是从它开始说起. 自动装配流程 首先我们来看下@SpringBootApplication 这个注解的背后又有什么玄机呢,我们按下 ctrl + 鼠标左键,轻轻的点一下,此时见证奇迹的时刻.. 我们看到如下优雅的代码: 这其中有两个比较容易引起我们注意的地方,一个是@SpringBootConfigur

  • springBoot2.6.2自动装配之注解源码解析

    目录 前言 一.@SpringBootConfiguration 二.@ComponentScan 三.@EnableAutoConfiguration 3.1@AutoConfigurationPackage 3.2 @import 四.按需装配 前言 自动装配的核心即@SpringBootApplication注解中三大注解核心 @SpringBootApplication @SpringBootConfiguration @ComponentScan @EnableAutoConfigur

  • springboot自动装配的源码与流程图

    前言 在使用SpringBoot开发项目中,遇到一些 XXX-XXX-starter,例如mybatis-plus-boot-starter,这些包总是能够自动进行配置, 减少了开发人员配置一些项目配置的时间,让开发者拥有更多的时间用于开发的任务上面.下面从源码开始. 正文 SpringBoot版本:2.5.3 从@SpringBootApplication进入@EnableAutoConfiguration 然后进入AutoConfigurationImportSelector @Target

  • SpringBoot2自动装配原理解析

    目录 1.SpringBoot特点 1.1依赖管理 1.2自动配置 2.容器功能 2.1组件添加 1.@Configuration 2.@Bean.@Component.@Controller.@Service.@Repository 3.@ComponentScan.@Import 4.@Conditional 2.2.原生配置引入@ImportResource 2.3配置绑定 1.@ConfigurationProperties 3.自动配置原理入门 3.1引导加载自动配置类 3.2按需开启

  • springboot自动配置原理解析

    前言 小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用的是strust2或者是springmvc框架来开发web应用,但是这两个框架都有一个特点就是配置非常的繁琐,要写一大堆的配置文件,spring在支持了注解开发之后稍微有些改观但有的时候还是会觉得比较麻烦,这个时候springboot就体现出了它的优势,springboot只需要一个properties或者yml文件就可以简化springmvc中在xml中需要配置的一大堆

  • SpringBoot自动装配原理小结

    约定优于配置(Convention Over Configuration)是一种软件设计范式,目的在于减少配置的数量或者降低理解难度,从而提升开发效率. 先总结一下结论: springboot通过spring.factories能把main方法所在类路径以外的bean自动加载,其目的就是为了帮助自动配置bean,减轻配置量 springboot autoconfig的一些实验 一个springboot工程,springbootautoconfig.test.config这个包和启动类的包不再同一

  • springboot自动装配原理初识

    运行原理 为了研究,我们正常从父项目的pom.xml开始进行研究. pom.xml 父依赖 spring-boot-starter-parent主要用来管理项目的资源过滤和插件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE<

  • Java SpringBoot自动装配原理详解及源码注释

    目录 一.pom.xml文件 1.父依赖 2.启动器: 二.主程序: 剖析源码注解: 三.结论: 一.pom.xml文件 1.父依赖 主要是依赖一个父项目,管理项目的资源过滤以及插件! 资源过滤已经配置好了,无需再自己配置 在pom.xml中有个父依赖:spring-boot-dependencies是SpringBoot的版本控制中心! 因为有这些版本仓库,我们在写或者引入一些springboot依赖的时候,不需要指定版本! 2.启动器: 启动器也就是Springboot的启动场景; 比如sp

  • 深入了解Java SpringBoot自动装配原理

    目录 自动装配原理 SpringBootApplication EnableAutoConfiguration AutoConfigurationImportSelector 总结 在使用springboot时,很多配置我们都没有做,都是springboot在帮我们完成,这很大一部分归功于springboot自动装配,那springboot的自动装配的原理是怎么实现的呢? 自动装配原理 springboot 版本:2.4.3 SpringBootApplication springboot启动类

  • 最新springboot中必须要了解的自动装配原理

    目录 1.pom.xml 2.启动器 3.主程序 3.1注解 3.2 spring.factories 4. 结论 1.pom.xml 父 依 赖 \textcolor{orange}{父依赖} 父依赖 spring-boot-dependencies:核心依赖都在父工程中 这里ctrl+左键,点击之后我们可以看到父依赖 这个里面主要是管理项目的资源过滤及插件,我们发现他还有一个父依赖 看看下面这个,熟悉吗? 再点进去,我们发现有很多的依赖.这就是SpringBoot的版本控制中心. 这个地方才

  • SpringBoot详细分析自动装配原理并实现starter

    目录 约定优于配置 自动装配 手写一个starter组件 约定优于配置 SpringBoot的预定优于配置主要体现在以下几个方面: maven的目录结构: 配置文件默认存放在resources目录下 项目编译后的文件存放在target目录下 项目默认打包成jar格式 配置文件默认为application.yml或application.yaml或application.properties 默认通过 spring.profiles.active 属性来决定运行环境时的配置文件. 自动装配 相对于

随机推荐