拆解Spring boot:Springboot为什么如此丝滑而简单?源码剖析解读自动装配
springboot帮我们做了什么
一个字--自动!
通常搭建一个基于spring的web应用,我们需要做以下工作:
1、pom文件中引入相关jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar ...
2、配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 ...
3、配置数据库连接、配置spring事务
4、配置视图解析器
5、开启注解、自动扫描功能
6、配置完成后部署tomcat、启动调试
......
这些都是Spring boot在背后默默为我们做的工作
那 有没有想过为什么?
本文给大家来解读Spring的源码 拆解他的自动配置 一步一步解释为什么Springboot为何那么强大
进入他的细节源码之前 首先关注 ---架构
解读SpringBootApplication
@Configuration
这里的@Configuration 对我们来说不陌生,它就是 JavaConfig 形式的 Spring Ioc 容器的配置类使用的那个@Configuration,SpringBoot 社区推荐使用基于 JavaConfig 的配置形式,所以,这里的启动类标注了@Configuration 之后,本身其实也是一个 IoC 容器的配置类。 举几个简单例子回顾下,XML 跟 config 配置方式的区别:
表达形式层面 基于 XML 配置的方式是这样:
而基于 JavaConfig 的配置方式是这样:
任何一个标注了@Configuration 的 Java 类定义都是一个 JavaConfig 配置类。
注册 bean 定义层面 基于 XML 的配置形式是这样:
而基于 JavaConfig 的配置形式是这样的:
任何一个标注了@Bean 的方法,其返回值将作为一个 bean 定义注册到 Spring 的 IoC 容器,方法名将默认成该 bean 定义的 id。
表达依赖注入关系层面 为了表达 bean 与 bean 之间的依赖关系,在 XML 形式中一般是这样:
而基于 JavaConfig 的配置形式是这样的:
@ComponentScan:
@ComponentScan注解用于指定Spring容器扫描组件的基础包路径。它会自动扫描指定包及其子包下的类,并将被@Component及其派生注解标注的类识别为Spring的组件,将其实例化并纳入容器管理。
@ComponentScan的原理可以从源代码的角度来解释。在Spring的源代码中,@ComponentScan注解被解析为一个Bean扫描器。当Spring容器启动时,扫描器会根据指定的包路径,将带有@Component及其派生注解的类解析为BeanDefinition对象,并注册到BeanFactory中。这样,Spring容器就知道这些类是组件,并可以对其进行实例化和管理。
@EnableAutoConfiguration:
@EnableAutoConfiguration注解用于启用Spring Boot的自动配置功能。它会根据项目的依赖和配置,自动加载和配置一系列的Spring Bean,简化了项目的配置过程。
@EnableAutoConfiguration的原理可以从源代码的角度来解释。在Spring Boot的源代码中,@EnableAutoConfiguration注解被解析为一个自动配置处理器。当Spring Boot应用启动时,处理器会根据classpath下的META-INF/spring.factories文件中的配置,加载并执行一系列的自动配置类。这些自动配置类根据约定和条件,自动创建和配置相应的Bean对象,完成项目的自动化配置。
Import(AutoConfigurationImportSelector.class)注解:
图中看出 AutoConfigurationImportSelector 继承了 DeferredImportSelector 继承了 ImportSelector
ImportSelector有一个方法为:selectImports。
AutoConfigurationImportSelector是Spring Boot内部的一个选择器类,它会根据项目的依赖和配置,选择要自动配置的类。该选择过程是基于条件注解(如@ConditionalOnClass、@ConditionalOnProperty等)进行的,只有满足条件的自动配置类才会被选择。
@AutoConfigurationPackage
当Spring Boot启动时,它会扫描并解析主配置类ApplicationConfig
。在解析过程中,Spring Boot会检测到@AutoConfigurationPackage
注解,并执行相应的处理。
@AutoConfigurationPackage
注解被解析为一个特殊的Bean定义处理器。处理器会读取主配置类ApplicationConfig
的包路径(com.example
),并将该包路径注册到Spring的BeanFactory中。
注册完成后,Spring容器会将com.example
包及其子包作为组件扫描的范围。这意味着Spring会扫描该包下的所有类,并根据条件注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
等)来决定是否自动配置相应的Bean。
通过将主配置类所在的包及其子包作为自动配置的包,我们可以确保自动配置类能够正确地扫描和应用到我们的应用程序中。
- 点赞
- 收藏
- 关注作者
评论(0)