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

Spring Boot 自动装配原理

核心注解@SpringBootApplication

Spring Boot 自动装配的核心是@SpringBootApplication注解。
它是一个组合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan。

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

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

@Configuration

作用:用于标识一个类是一个配置类,它可以替代传统的 XML 配置文件来配置 Spring 容器中的 Bean。
被@Configuration注解标记的类内部可以使用@Bean注解来定义各种 Bean,这些 Bean 会被 Spring 容器管理和实例化。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@ComponentScan

作用:用于指定 Spring 容器扫描组件的基础包路径,它会自动扫描被@Component、@Service、@Repository、@Controller等注解标记为component的类,并将它们注册为 Spring 容器中的 Bean。
通过@ComponentScan注解,可以让 Spring 自动发现和管理项目中的各种组件,实现依赖注入等功能。

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.example.myapp")
public class AppConfig {

}

@EnableAutoConfiguration

@EnableAutoConfiguration是实现自动装配的关键,自动引入配置、依赖。
当 Spring Boot 应用启动时,@EnableAutoConfiguration注解会促使 Spring Boot 去查找类路径下的META-INF/spring.factories文件。这个文件里面配置了很多自动配置类,这些自动配置类都是以xxxAutoConfiguration命名的。

这些自动配置类中大量使用了条件注解。通过这些条件注解,创建并注入bean到容器中。自动配置能够根据项目中实际引入的依赖和已有的配置情况(类是否存在、bean是否存在),灵活地决定是否要进行某些配置。
比如@ConditionalOnClass会判断指定的类是否在类路径下存在,如果存在才会执行相应的配置逻辑;还有@ConditionalOnMissingBean,它会检查容器中是否不存在某个特定的 Bean,如果不存在就会创建并注入相应的 Bean。
最后,当所有的条件都满足时,自动配置类就会创建相应的 Spring Bean,并将它们注入到 Spring 容器中,这样开发人员就无需手动去配置大量的 Spring 组件了,大大简化了开发过程,提高了开发效率。


http://www.kler.cn/a/393193.html

相关文章:

  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • Python →爬虫实践
  • 【练习案例】30个 CSS Javascript 加载器动画效果
  • 知识图谱6:neo4j查询语句
  • Pycharm PyQt5 环境搭建创建第一个Hello程序
  • 【真题笔记】21年系统架构设计师案例理论点总结
  • C++20 STL CookBook 7 Containers(II)
  • Elman 神经网络算法详解
  • 详解kafka消息发送重试机制的案例
  • Threejs 材质贴图、光照和投影详解
  • Redis增删改查、复杂查询案例分析
  • 【计算机网络】【网络层】【习题】
  • 网络安全——应急响应之Linux入侵排查
  • 2024 年 8 个最佳 API 设计工具图文介绍
  • Java开发人员从零学习ArkTs笔记(二)-函数与类
  • Ubuntu20.04 为脚本文件创建桌面快捷方式 ubuntu
  • Spring Boot框架:电商开发的新趋势
  • #渗透测试#SRC漏洞挖掘#云技术基础03之容器相关
  • 如何用Chrome的Network面板分析HTTP报文
  • 壁仞科技上市前最后一波 校招 社招 内推
  • 基于Java Springboot在线教育学习系统
  • 卫导调零天线功率倒置算法原理及MATLAB仿真
  • 【paper】分布式无人水下航行器围捕智能目标
  • ONLYOFFICE 8.2深度测评:集成PDF编辑、数据可视化与AI功能的强大办公套件
  • Git的使用(基础语句)
  • [AIGC] Python批量处理Excel中的ASR语音文本数据