首页 > 其他分享 >SpringBoot自动装配原理

SpringBoot自动装配原理

时间:2024-12-05 20:31:26浏览次数:6  
标签:装配 SpringBoot public Bean template 注解 原理 Import class

SpringBoot自动装配原理

在介绍SpringBoot自动装配原理之前我们需要先看一个注解 --> SpringBootApplication

@SpringBootApplication
public class BackendApp {
    public static void main(String[] args) {
        SpringApplication.run(BackendApp.class, args);
    }
}

我们都知道SpringBootApplication是用来声明引导类的 , 除此之外他还应用于自动装配

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

打开源码我们可以看到 , 除了元注解之外在SpringBootApplication中还提供了三种注解

  • SpringBootConfigurtion --> 声明配置类
  • EnableAutoConfiguration --> 自动装配
  • ComponentScan --> 扫描包

那么SpringBoot自动装配就和EnableAutoConfiguration 该注解相关

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

在这里有两个很重要的注解

  • @AutoConfigurationPackage
  • @Import({AutoConfigurationImportSelector.class})

对于AutoConfigurationPackage它的作用是扫描我们在项目中自行定义的Bean(如Controller , Service , Dao层的Bean) , 其内部通过了Import导入了AutoConfigurationPackages.Registrar.class , 可以扫描项目当中的Bean

而@Import({AutoConfigurationImportSelector.class}) , 就是导入自动配置的选择器 , 该选择器会加载一个文件 , 该文件定义了很多自动配置的类

在这里插入图片描述

这里以RedisAutoConfiguration为列 , 我们看看都做了什么

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

首先我们来看一个注解 @ConditionalOnClass({RedisOperations.class})

该注解是用来判断类路径当中是否包含该字节码文件 , 简单来说就是有没有导入对应的依赖 , 如果导入了才能创建该Bean

除此之外在创建Bean的过程中还会通过

@ConditionalOnMissingBean(
name = {“redisTemplate”}
)

来判断在Bean中是否已经存在过了名为redisTemplate的注解 , 以便于开发者自行配置

==========================================================

面试官:Springboot自动配置原理

候选人

嗯,好的,它是这样的。

在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

其中@EnableAutoConfiguration是实现自动化配置的核心注解。

该注解通过@Import注解导入对应的配置选择器。关键的是内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。

在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。

一般条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

标签:装配,SpringBoot,public,Bean,template,注解,原理,Import,class
From: https://blog.csdn.net/xiugtt6141121/article/details/144275254

相关文章

  • C# 开发超高频 915MHz/2.45GHz 射频卡应用:原理、代码与案例解析
    目录引言超高频915MHz/2.45GHz射频卡的工作原理射频卡的工作频段与标准数据传输协议与通信方式C#开发环境配置与硬件要求硬件选择驱动与SDK配置C#与超高频射频卡通信实现初始化与连接发送与接收数据数据解析与处理案例解析:物流管理系统系统设计与需......
  • 基于 SpringBoot 的招生管理系统
    摘要在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括招生管理系统的网络应用,在外国招生管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。招生管理系统具有招生公告信息管理功能的选择。招生管理系统采用java技术,基于springboo......
  • SpringBoot外卖点餐系统
    摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点......
  • .NET Core 锁(Lock)底层原理浅谈
    CPU原子操作原子操作,指一段逻辑要么全部成功,要么全部失败。概念上类似数据库事物(Transaction).CPU能够保证单条汇编的原子性,但不保证多条汇编的原子性那么在这种情况下,那么CPU如何保证原子性呢?CPU本身也有锁机制,从而实现原子操作眼见为实intlocation=10;......
  • IntelliJ+SpringBoot项目实战(27)--实现国际化项目开发
        因为有时候承接一些国外项目,项目需要支持国际化。国际化包括页面静态文字的国际化,接口中返回的信息的国际化,JS脚本里内容的国际化。一、配置国际化语言    在openjweb-core工程中增加默认国际化语言配置类:packageorg.openjweb.core.config;importja......
  • 【RAS非对称加密算法】DEMO原理与示例
    fromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_OAEP#生成RSA密钥对defgenerate_rsa_keys():"""公钥是通过特定算法从私钥导出的,可以安全地公开。公钥用于加密数据或验证签名。私钥用于解密数据或生成签名。""......
  • 深入解析Java注解机制:获取注解数据的原理
    深入解析Java注解机制:获取注解数据的原理引言在Java编程中,注解(Annotation)是一种元数据形式,它提供了关于程序代码的数据,但它们并不是程序本身的一部分。注解可以用于编译时或运行时处理,以提供额外的信息或者影响程序行为。本文将深入探讨如何解析Java中的注解,并介绍AnnotatedElem......
  • springboot毕设 青少年视力筛查系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代科技的飞速发展,青少年群体对于电子产品的依赖程度日益加深,长时间面对屏幕不仅改变了他们的生活方式,也对视力健康构成了严峻挑战。近年来,我国......
  • springboot毕设 汽车管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代科技的飞速发展,汽车行业正经历着前所未有的变革。智能化、信息化已成为汽车产业发展的新趋势。在这一背景下,汽车管理系统的研发显得尤为重要......
  • 软考教材重点内容 信息安全工程师 第 8 章防火墙技术原理与应用
    8.1.1防火墙概念根据网络的安全信任程度和需要保护的对象,人为地划分若干安全区域,这些安全区域有:公共外部网络,如Internet;内联网(CIntranet),如某个公司或组织的专用网络,网络访问限制在组织内部;外联网(Extranet),内联网的扩展延伸,常用作组织与合作伙伴之间进行通信;军......