首页 > 其他分享 >Spring Boot的自动装配原理及流程

Spring Boot的自动装配原理及流程

时间:2024-02-01 10:13:19浏览次数:33  
标签:装配 run Spring 配置 Boot Bean 自动 注解

自动装配的流程(原理)
                       
参考链接:https://blog.csdn.net/weixin_45764765/article/details/110250531
1、main方法中SpringApplication.run(HelloBoot.class,args)的执行流程中有refreshContext(context)。

2、而这个refreshContext(context)内部会解析,配置类上自动装配功能的注解@EnableAutoConfiguration中的,@EnableAutoConfiguration中的,引入类AutoConfigurationImportSelector。

3、AutoConfigurationImportSelector这个类中的方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()会读取jar包中的/项目中的META-INF/spring.factories文件。

4、spring.factories配置了自动装配的类,最后根据配置类的条件,自动装配Bean。

 

 

 

 

 

 


 
二、回顾在普通的Spring项目中的做法

在没有使用Spring Boot之前,我们需要在xml文件中进行需要用到的Bean的配置(以最常用的mybatis的使用为例)。

在使用到mybatis时,除了引入依赖外,我们需要配置相关的Bean(DataSource的bean、SqlSessionFactory的bean)

而在用到Spring Boot后,我们只需要引入依赖,再加上少量的配置就可以完成自动装配。

在properties文件中配置:

这得益于Spring Boot的自动装配。

 
三、Spring Boot的自动装配原理
1、从程序的入口,main方法开始

在启动类的main方法中我们可以看到,使用调用了类SpringApplication中的一个run()方法,这个run()方法的主要作用是去加载启动类(例如,类HelloBoot)。

下面就来看看这个run()方法是如何去加载启动类的:
(1)在类SpringApplication中的第一个run()方法,把参数传了进去。

实际上,它是调用了下面这个run()方法。
(2)而下面这个run()方法,创建了一个SpringApplication对象,然后又调用了另外一个run方法。

(3)而这第三个run()方法refreshContext(ConfigurableApplicationContext context)拿到配置类,然后去解析配置类,主要是解析配置类上的注解@SpringBootApplication

(也就是这个启动类 )

那么,这个注解 @SpringBootApplication有什么呢?
 2、注解@SpringBootApplication

包含了很多个注解,其中有@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan

 

(1)注解@SpringBootConfiguration

本质上,它是一个配置类

(2)注解@ComponentScan

它的作用是扫描当前包及其子包(这也是为什么有时我们把启动类放错位置,而导致无法扫描到某些包的原因)

(3)注解@EnableAutoConfiguration

它是自动装配的注解

@EnableAutoConfiguration上面加载了一个类,AutoConfigurationImportSelector类,该类会调方法getCandidateConfigurations()拿到配置

进入loadFactoryNames()方法,获取资源,并且完成资源文件spring-factories的读取

也就是说通过类加载classLoader,去加载META-INF下的spring-factories文件

并且加载系统中“META-INF/spring-factories”

那么, FACTORIES_RESOURCE_LOCATION 中主要有什么呢?

以上面的 DataSource 为例

可以看到,在spring-factories中配置了自动装配类

 

这个自动装配类会被读取到内存中

 

这个类本质上就是配置类,贴了注解@bean,也就是说这里会创建Datasource。

这个方法,返回的是一个DruidDataSoureWrapper

 

注解@ConfigurationProperties,作用是把配置文件中,前缀是Spring.datasource.druid的,注入到该对象。最后,框架拿到数据库的连接信息(账号密码等四要素),才能帮我们创建出Datasource。

特别地,贴了注解@ConditionalOnMissingBean(条件注解),代表着当前上下文中不存在该对象时,才会实例化一个Bean

 

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)

@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)

@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)

@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)

@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean) @ConditionalOnNotWebApplication(不是web应用)
四、小结:自动装配的流程(原理)

1、main方法中SpringApplication.run(HelloBoot.class,args)的执行流程中有refreshContext(context)。

2、而这个refreshContext(context)内部会解析,配置类上自动装配功能的注解@EnableAutoConfiguration中的,@EnableAutoConfiguration中的,引入类AutoConfigurationImportSelector。

3、AutoConfigurationImportSelector这个类中的方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()会读取jar包中的/项目中的META-INF/spring.factories文件。

4、spring.factories配置了自动装配的类,最后根据配置类的条件,自动装配Bean。

                        
参考链接:https://blog.csdn.net/weixin_45764765/article/details/110250531

标签:装配,run,Spring,配置,Boot,Bean,自动,注解
From: https://www.cnblogs.com/JavaYuYin/p/18000646

相关文章

  • Windows环境安装配置Miniconda
    从官网下载安装Miniconda配置环境变量”此电脑“右击”属性“->”高级系统设置“->”高级“->”环境变量“->”系统变量“->”Path“->”编辑“”新建“->添加”路径\miniconda3“”新建“->添加”路径\miniconda3\Scripts“”新建“->添加”路径\miniconda3\Library\bin“......
  • 使用注解替换Spring配置文件&SpringMVC的配置文件
    创建初始化类,替换web.xml在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebA......
  • SpringMVC之异常处理器的使用
    SpringMVC的异常处理器是处理控制器方法执行过程出现的异常。SpringMVC提供了一个处理异常的接口HandlerExceptionResolver。HandlerExceptionResolver接口有两个实现类:DefaultHandlerExceptionResolver实现类和SimpleMappingExceptionResolver实现类。DefaultHandlerExcepti......
  • 【Spring】- 任意方法替换
    【任意方法替换】方法注入的一种不太有用的形式是能够用另一种方法实现替换托管bean中的任意方法实现org.springframework.beans.factory.support.MethodReplacer接口的类提供了新的方法定义publicclassMyValueCalculator{publicStringcomputeValue(Stringinput){......
  • Java调用ChatGPT(基于SpringBoot和Vue)实现连续对话、流式输出和自定义baseUrl
     源码及更详细的介绍说明参见Git上的README.md文档https://github.com/asleepyfish/chatgpt本文Demo(SpringBoot和Main方法Demo均包括)的Git地址:https://github.com/asleepyfish/chatgpt-demo流式输出结合Vue前端的Demo的Git地址:https://github.com/asleepyfish/chatg......
  • SpringMVC拦截器的使用
    SpringMVC中的拦截器主要用于拦截控制器方法的执行。SpringMVC配置拦截器SpringMVC中的拦截器需要实现HandlerInterceptor接口publicclassFirstInterceptorimplementsHandlerInterceptor{//该方法是在控制器方法执行前执行@OverridepublicbooleanpreHandl......
  • SpringBoot中两种常用定位切点的方法
    有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本文主要讲解两种在SpringBoot中定位切点的方法,一种是使用execution表达式的方法,一种则是利用自定义注解的方法。execution表达式execution表达式的方式主要是在定义切点的时候,通过表达......
  • SpringBoot介绍
    SpringBoot一、介绍我们在搭建传统SSM项目时,通常需要导入很多依赖,但每种依赖又有许多版本,这就很容易出现依赖冲突。此外,繁琐的配置也是一大痛点,太多了,让人很难记住,因此SpringBoot诞生了。SpringBoot是对Spring的深度封装,基于约定优于配置的思想,提供了大量的默认配置和实现。......
  • 基于springboot开发的工作流系统,bpmn.js,vue源码及功能分析(activiti)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作......
  • Spring事务的传播行为
    Spring事务的传播行为1.概述当我们遇到下面的情况时,一个service中调用了另一个service中的方法(两个service中都存在事务),此时bservice中的事务就被传播到了aservice中,这样就产生了事务的传播。@SercicepublicclassAservice{@AutoWiredprivateBservicebservice......