当前位置: 首页 > news >正文

@SpringBootApplication剖析

一、前言

在SpringBoot项目中启动类必须加一个注解@SpringBootApplication,今天我们来剖析@SpringBootApplication这个注解到底做了些什么。

二、@SpringBootApplication简单分析

进入@SpringBootApplication源代码如下:

可以看出@SpringBootApplication是一个复合注解,里边主要组合了

@SpringBootConfiguration、@CompoentScan、@EnableAutoConfiguration这三个注解。

1、@SpringBootConfiguration

@SpringBootConfiguration组合了@Configuration,它是用来声明当前类是一个配置类,被注解类的内部包含一个或多个@Bean注解的方法,用于替换xml配置定义,这些方法将被

AnnotationConfigApplicationContext类进行扫描,注入Spring容器中。

简单例子:直接使用@Configuration和@Bean来注入容器。

(1)创建一个普通项目,引入依赖

implementation 'org.springframework:spring-context:5.1.9.RELEASE'

2)创建一个Configuration类 ,定义Bean对象。

@Configuration @Bean相当于

<beans>

    <bean id="user" class="org.example.User"></bean>

</beans>

的定义。

(3)测试类

通过AnnotationConfigApplicationContext将定义的Bean加载到Spring IOC容器中。

输出如下:

注:AnnotationConfigApplicationContext最终会调用BeanDefinitionReaderUtils.registerBeanDefinition进行注入。

2、@CompoentScan

定义一个Spring Bean是在类上加上注解@Service、@Controller、@Compent就可以,而Spring是通过扫描@CompoentScan指定包下所有加了注解的类,如果不写它只会加载启动类所在的包及下级包。

简单例子:

(1)、在包com.example.sacn新建一个类

(2)、在包com.example.app下创建一个启动类

(3)、输出找不到对应的Bean

(4)、启动类加注解,运行正常

@ComponentScan("com.example.scan")

具体源代码在

ComponentScanAnnotationParser.parse()会将所有标注了@Component并匹配@ComponentScan规则的类都注册到容器中去,@Controller、@Service、@Responsitory都标有@Conpoment注解。

3、@EnableAutoConfiguration

@EnableAutoConfiguration是SpringBoot实现自动化配置的核心注解,通过这个注解把Spring应用所需的bean注入到容器中。

@EnableAutoConfiguration通过@Import注入一个ImportSelector的实现类AutoConfigurationImportSelector,这个类根据我们的配置动态加载所需要的Bean。

核心代码如下:

注:主要完成过滤筛选需要注入的类。

催着吃钣了!

http://www.lryc.cn/news/183207.html

相关文章:

  • 浅谈wor2vec,RNN,LSTM,Transfermer之间的关系
  • 【11】c++设计模式——>单例模式
  • 深度学习-卷积神经网络-AlexNET
  • 人机关系不是物理关系也不是数理关系
  • <html dir=ltr>是什么意思?
  • 工厂模式:简化对象创建的设计思想 (设计模式 四)
  • 【2023最新】微信小程序中微信授权登录功能和退出登录功能实现讲解
  • 复习 --- C++运算符重载
  • 复习 --- select并发服务器
  • 程序三高的方法
  • 全志ARM926 Melis2.0系统的开发指引⑦
  • 全志ARM926 Melis2.0系统的开发指引⑧
  • 区别对比表:阿里云轻量服务器和云服务器ECS对照表
  • 【做题笔记】多项式/FFT/NTT
  • 网课搜题 小猿题库多接口微信小程序源码 自带流量主
  • centos安装conda python3.10
  • 解密京东面试:如何应对Redis缓存穿透?
  • #力扣:1. 两数之和@FDDLC
  • 【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)
  • 【AI视野·今日Robot 机器人论文速览 第四十六期】Tue, 3 Oct 2023
  • macOS三种软件安装目录以及环境变量优先级
  • 嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动
  • 企业微信机器人对接GPT
  • 【数据结构】排序(1) ——插入排序 希尔排序
  • Python 列表推导式深入解析
  • 信息学奥赛一本通-编程启蒙3103:练18.3 组别判断
  • C++ primer plus--探讨 C++ 新标准
  • 2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
  • 选择排序算法:简单但有效的排序方法
  • 安卓教材学习