本文来说下Spring Boot中的自动装配机制。SpringBoot最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),通过SpringBoot为我们提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。
文章目录
概述
如果我们想要使用传统意义上的 Spring 应用,那么需要配置大量的 xml 文件才可以启动,而且随着项目的越来越庞大,配置文件也会越来越繁琐,这在一定程度上也给开发者带来了困扰,于是 SpringBoot 就应运而生了。
什么是SpringBoot
2012 年 10 月,一个叫 Mike Youngstrom 的人在 Spring Jira 中创建了一个功能请求,要求在 Spring Framework 中支持无容器 Web 应用程序体系结构,提出了在主容器引导 Spring 容器内配置 Web 容器服务。这件事情对 SpringBoot 的诞生应该说是起到了一定的推动作用。
SpringBoot 的诞生就是为了简化 Spring 中繁琐的 XML 配置,其本质依然是 Spring 框架,使用 SpringBoot 之后可以不使用任何 XML 配置来启动一个服务,使得我们在使用微服务架构时可以更加快速地建立一个应用。
SpringBoot 具有以下特点:
- 创建独立的 Spring 应用。
- 直接嵌入了 Tomcat、Jetty 或 Undertow(不需要部署 WAR 文件)。
- 提供了固定的配置来简化配置。
- 尽可能地自动配置 Spring 和第三方库。
- 提供可用于生产的特性,如度量、运行状况检查和外部化配置。
- 完全不需要生成代码,也不需要 XML 配置。
SpringBoot 这些特点中最重要的两条就是约定优于配置和自动装配。
约定优于配置
SpringBoot 的约定由于配置主要体现在以下方面:
- maven 项目的配置文件存放在 resources 资源目录下。
- maven 项目默认编译后的文件放于 target 目录。
- maven 项目默认打包成 jar 格式。
- 配置文件默认为 application.yml 或者 application.yaml 或者 application.properties。
- 默认通过配置文件 spring.profiles.active 来激活配置。
自动装配
自动装配是什么及作用
springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理。下面详细分析。
自动装配则是 SpringBoot 的核心,自动装配是如何实现的呢?为什么我们只要引入一个 starter 组件依赖就能实现自动装配呢,接下来就让我们一起来探讨下 SpringBoot 的自动装配机制。
相比较于传统的 Spring 应用,搭建一个 SpringBoot 应用,我们只需要引入一个注解 @SpringBootApplication,就可以成功运行。
我们就从 SpringBoot的这个注解开始入手,看看这个注解到底替我们做了什么。
@SpringBootApplication注解源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters =