首页 > 其他分享 >springboot自动装配

springboot自动装配

时间:2023-07-03 11:22:38浏览次数:47  
标签:装配 调用 springboot spring 自动 注解 方法

1、自动装配是什么及作用

springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理

2、spring自动装配的原理

2.1、启动类上注解的作用

@SpringBootApplication
这个注解是springboot启动类上的一个注解,是一个组合注解,也就是由其他注解组合起来,它的主要作用就是标记说明这个类是springboot的主配置类,springboot应该运行这个类里面的main()方法来启动程序

这个注解主要由三个子注解组成:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@SpringBootConfiguration
这个注解包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组件

 

@EnableAutoConfiguration
这个注解是开启自动配置的功能,里面包含了两个注解

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage
这个注解的作用说白了就是将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中,这也就是为什么我们在利用springboot进行开发的时候,无论是Controller还是Service的路径都是与主配置类同级或者次级的原因


@Import(AutoConfigurationImportSelector.class)
上一个注解我们把所有组件都加载到了容器里面,这个注解就是将需要自动装配的类以全类名的方式返回,那是怎么找到哪些是需要自动装配的类呢?

1、AutoConfigurationImportSelector这个类里面有一个方法selectImports(),如下

2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法,这个方法里面又调用了一个getCandidateConfigurations()方法

3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法

4、loadFactoryNames()方法里面又调用了一个loadSpringFactories()方法

5、关键就在这个loadSpringFactories()方法里面,在这个方法里,它会查找所有在META-INF路径下的spring.factories文件


6、在META-INF/spring.factories这个文件里面的数据是以键=值的方式存储,然后解析这些文件,找出以EnableAutoConfiguration为键的所有值,以列表的方式返回

 

@ComponentScan
这个注解的作用就是扫描当前包及子包的注解

2.2、springboot自动装配的流程

1、在springboot启动的时候会创建一个SpringApplication对象,在对象的构造方法里面会进行一些参数的初始化工作,最主要的是判断当前应用程序的类型以及设置初始化器以及监听器,并在这个过程中会加载整个应用程序的spring.factories文件,将文件中的内容放到缓存当中,方便后续获取;

2、SpringApplication对象创建完成之后会执行run()方法来完成整个应用程序的启动,启动的过程中有两个最主要的方法prepareContext()和refreshContext(),在这两个方法中完成了自动装配的核心功能,在run()方法里还执行了一些包括上下文对象的创建,打印banner图,异常报告期的准备等各个准备工作,方便后续进行调用;

3、在prepareContext()中主要完成的是对上下文对象的初始化操作,包括属性的设置,比如设置环境变量。在整个过程中有一个load()方法,它主要是完成一件事,那就是将启动类作为一个beanDefinition注册到registry,方便后续在进行BeanFactoryPostProcessor调用执行的时候,可以找到对应执行的主类,来完成对@SpringBootApplication、@EnableAutoConfiguration等注解的解析工作;

4、在refreshContext()方法中会进行整个容器的刷新过程,会调用spring中的refresh()方法,refresh()方法中有13个非常关键的方法,来完成整个应用程序的启动。而在自动装配过程中,会调用的关键的一个方法就是invokeBeanFactoryPostProcessors()方法,在这个方法中主要是对ConfigurationClassPostProcessor类的处理,这个类是BFPP(BeanFactoryPostProcessor)的子类,因为实现了BDRPP(BeanDefinitionRegistryPostProcessor)接口,在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry()方法,然后再调用BFPP中的postProcessBeanFactory()方法,在执行postProcessBeanDefinitionRegistry()方法的时候会解析处理各种的注解,包含@PropertySource、@ComponentScan、@Bean、@Import等注解,最主要的是对@Import注解的解析;

5、在解析@Import注解的时候,会有一个getImport()方法,从主类开始递归解析注解,把所有包含@Import的注解都解析到,然后在processImport()方法中对import的类进行分类,例如AutoConfigurationImportSelect归属于ImportSelect的子类,在后续的过程中会调用DeferredImportSelectorHandler类里面的process方法,来完成整个EnableAutoConfiguration的加载。

3、相关注解的作用

@Conditional

这个注解主要作用在类上,表示条件注入,就是当满足某个条件的时候,这个类才会被注入到 IOC 容器中,例如@ConditionalOnMissingBean,这个注解就是当容器中没有配置特定的Bean的时候,这个组件才会被注册到ioc容器中,否则会直接忽略

自动配置中使用的条件化注解 
===============================================================================================================
条件化注解                             配置生效条件 
===============================================================================================================
@ConditionalOnBean                     配置了某个特定Bean 
@ConditionalOnMissingBean             没有配置特定的Bean 
@ConditionalOnClass                 Classpath里有指定的类 
@ConditionalOnMissingClass             Classpath里缺少指定的类 
@ConditionalOnExpression             给定的Spring Expression Language(SpEL)表达式计算结果为true 
@ConditionalOnJava                     Java的版本匹配特定值或者一个范围值 
@ConditionalOnJndi                     参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext 
@ConditionalOnProperty                 指定的配置属性要有一个明确的值 
@ConditionalOnResource                 Classpath里有指定的资源 
@ConditionalOnWebApplication         这是一个Web应用程序 
@ConditionalOnNotWebApplication     这不是一个Web应用程序 
————————————————
版权声明:本文为CSDN博主「好好玩_tyrant」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_57434877/article/details/123933529

标签:装配,调用,springboot,spring,自动,注解,方法
From: https://www.cnblogs.com/huigui-mint/p/17522300.html

相关文章

  • springboot框架介绍,让我们深入的了解
    ​ SpringBoot是一种用于快速构建基于Spring框架的Java应用程序的开源框架。它旨在简化Spring应用程序的开发过程,通过提供一种约定优于配置的方式,让开发人员能够快速搭建起一个可独立运行的、可部署的、易于扩展的应用。SpringBoot内置了许多开箱即用的功能和插件,使得开发者......
  • 第三天(SpringBoot项目部署,简单HelloWorld,打包,yaml,注入配置文件,多环境配置)
    老师的文档里大部分都写得很清楚,此处只做部分补充此处JDK应选1.8版本的,版本太高有几率出错添加启动web的依赖添加insert+alt快速配置constructorgettersettertostring松散绑定检验矫正依赖添加......
  • 实现 GitLab CI/CD 自动化发布网站至本地IIS服务器
    下面列出我本次使用的环境:操作系统:Windows11项目版本:.NETCore6.0脚本执行环境:PowerShell5.1.22621.963Web服务器:IIS10.0Gitlab:git.local 基本步骤配置GitLabCI/CDRunner  首先,在本地或公司内网的机器上设置一个GitLabCI/CDRunner,该Runner将用于执行CI/......
  • pywinauto 自动化入门
    #第一步实例化要操作的进程:得到的Application对象#第二步选择窗口:app.window(筛选条件)得到的窗口是WindowSpecification对象#第三步:基于WindowSpecification对象使用其方法再往下查找,定位到具体的控件#第四步:使用控件执行我们需要的控制操作#获取应用对象两种方式#......
  • SpringBoot自动配置的认识
    一、springboot的简单理解springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目。springboot根据我们项目中所引入的依赖,比如引入了springmvc构件,就会判断出是要进行springmvc的web开发,就会把springmvc的相关的基本配置自动配置好,不需要我们在xm......
  • springboot+token+redis,模拟登录
    登录测试的controller:loginTest.javapackagecom.example.demo.controller;importcom.example.demo.po.ResponseBean;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;i......
  • 【springboot】springboot集成mysql
    在pom.xml增加依赖的坐标<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!--<dependency&......
  • 【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY
    ChatGPT是一种基于Token数量计费的语言模型,它可以生成高质量的文本。然而,每个新账号只有一个有限的初始配额,用完后就需要付费才能继续使用。为此,我们可能存在使用多KEY的情况,并在每个KEY达到额度上限后,自动将其删除。那么,我们应该如何实现这个功能呢?还请大家扫个小关。......
  • springboot使用拦截器
    要用拦截器必须要将实现HandlerInterceptor的拦截器注册到InterceptorRegistry对象中。需要先写一个拦截器,规则:实现HandlerInterceptor作用:在请求的处理过程中添加自定义的逻辑。preHandle():在请求被处理之前执行的逻辑,可以通过返回值决定是否继续处理请求。postHandle():......
  • SimpleDateFormat的setLenient(true或false)-----自动计算日期
    有时候我们需要判断用户的日期格式是否正确,虽然绝大多数会在前台处理,但是也有需要从文件流读入的情况,如果日期不合格就需要抛异常,这时候就需要禁止SimpleDateFormat的自动计算功能。此时就需要用到setLenient(),这个方法的含义是是否严格解析日期,具体用法如下。packagecom.test.......