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

SpringBoot框架—classpath、Bean、容器的概念

1.classpath

classpath是指Spring Boot 在运行时查找的编译后的.class类文件、配置文件和资源的路径集合。具体指哪些文件呢?以 Maven 或 Gradle 项目为例:

  • 编译后的输出目录

Maven:target/classes

Gradle:build/classes/java/main + build/resources/main

  • 第三方依赖库

Maven:pom.xml里添加的三方依赖库下载到本地的文件

Gradle:build.gradle里添加的三方依赖库下载到本地的文件

  • 安装的JDK lib文件夹里的jar文件

  • IDEA工具下的jar文件

可以在代码中输出System.getProperty("java.class.path")看到所有 classpath 

2.Bean和容器

Spring Bean是什么

本质是Java对象(实例化结果),只是它的创建、生命周期和依赖关系由Spring容器管理

SpringBoot 容器是什么

本质是一个管理和协调 Bean 的运行环境,可以把它理解成一个管家,你只要告诉它哪些对象需要它管理,它就会自动完成对象的实例化、组装、销毁,并保证bean之间能协调工作。

定义Bean

常规场景下也可称为注册Bean,也就是需要告诉Spring哪个对象需要它帮忙管理。

定义Bean的常规方法

  • 通过注解定义并自动注册

在类上添加定义Bean的注解,声明这是一个Bean,Spring Boot 启动时扫描到这些注解,会自动将类实例化为 Bean ,并注册到容器中,比如:

  • 通过配置类定义并显式注册

在 @Configuration 类中使用注解 @Bean, 声明该方法是一个Bean,Spring 会将该方法的返回值注册为 Bean

常用的定义Bean的注解有

@Component    通用注解,任何你需要定义为Bean的类上都可以用

@Service         派生自@Component,专用于Service层(业务逻辑层)

@Repository   派生自@Component,用于DAO层(数据库处理层),将处理数据时的异常转换为Spring 的统一异常

@Controller   派生自@Component,用于web层,适用处理 HTTP 请求,返回视图的场景

@RestController   是@Controller和@ResponseBody的组合,间接派生自@Component,用于web层,适用处理HTTP请求,返回Json、Xml数据的场景

@Bean    定义一个方法为一个Bean

注入Bean

Spring 根据类型或名称从容器中找到匹配的 Bean,然后将 Bean 赋值给其他对象的成员变量、方法参数、构造函数参数

注入Bean的方法

通过 @Autowired 注解标记字段

这行代码的意思是把"AutoTestScheduledService"类型的Bean赋值给 autoTestScheduledService

Bean在容器中的名称

每个 Bean 在容器中有唯一的名称,默认是类名首字母小写,也可通过 @Component("myBean") 自定义

SpringBoot Ioc容器

IOC容器是Springboot框架的一个核心组件,负责管理Bean的生命周期、依赖关系和配置,通过控制反转和依赖注入,极大地简化了对象的创建和管理过程

控制反转:是一种设计原则,核心思想是将程序的控制权从代码本身转移到外部容器或框架

依赖注入(DI):是控制反转的一种实现方式,其核心思想是:由外部容器主动将对象所需的依赖关系“注入”到对象中,而不是由对象自己创建或查找依赖

IoC容器有两个主要接口

  • BeanFactory:是Spring框架中最基础的IoC容器接口,由org.springframework.beans.facytory.BeanFactory 接口定义,提供最基本的 Bean 管理功能,如依赖注入、Bean 生命周期管理。BeanFactory容器延迟加载(Lazy-Loading)Bean,只有在需要时才会创建Bean,适用于资源受限或者要求较短启动时间的场景。
  • ApplicationContext:高级容器接口,是Spring Boot 的默认容器,继承自BeanFactory。ApplicationContext容器在应用程序启动时一次性创建并预加载所有Bean。它的主要实现类

        传统Spring框架中的实现类

        ClassPathXmlApplicationContext:从类路径(Classpath)下的 XML 文件中加载bean定义

        FileSystemXmlApplicationContext:从文件系统中的XML文件中加载bean定义

        AnnotationConfigApplicationContext:基于注解来配置和管理Bean

        SpringWeb应用中的实现类

        XmlWebApplicationContext:在Web应用中从类路径(Classpath) 或 Web 应用根目录下的xml文件中加载bean定义

        AnnotationConfigWebApplicationContext:在Web应用中基于注解来配置和管理Bean

        Springboot中的扩展实现类

        AnnotationConfigServletWebServerApplicationContext:Springboot ServletWeb应用中基于注解来配置和管理Bean

        ReactiveWebApplicationContext:Springboot响应式Web应用中基于注解来配置和管理Bean

3.添加依赖

在项目的构建文件中声明需要使用的 Spring Boot Starter或者其他三方库,和python中的pip install xxx是一个目的

如果是Maven构建,构建文件为pom.xml,三方库声明在dependencyManagement结构中

<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>xxx-xxx</groupId>
				<artifactId>xxx-xxx</artifactId>
				<version>xxxx</version>
			</dependency>
		</dependencies>
</dependencyManagement>

比如:


如果是Gradle构建,构建文件为build.gradle,三方库声明在buildscript中

4.IntelliJ IDEA 的“隐式编译”机制

Spring Boot 启动时扫描的是 classpath 下编译后的.class文件和配置文件,而非src/main/java和src/main/resources下的源码文件,可能很多刚用IntelliJ IDEA开发的测开同学会觉得自己在src/main/java和src/main/resources下新增的代码,并没有执行maven package,直接执行Application.java启动Springboot,新增的代码或者配置也会生效了,以为是直接运行src/main/java和src/main/resources下的源码。实际上是当执行Application.java启动Springboot时,IDE 会自动触发编译流程,将 src/main/java 中的 Java 源码编译成 .class 文件,并放在target/classes下,并将 src/main/resources 中的资源文件复制到target/classes下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/102269.html

相关文章:

  • 【Text2reward】code_generation/single_flow/results/gpt-4-0331/maniskill-zeroshot
  • 私有知识库 Coco AI 实战(一):Linux 平台部署
  • LabVIEW 开发中 TCP 与 UDP 协议的差异
  • 《晶振:时空节拍的契约者》
  • 业级无线监控技术解决方案:巨控GRM240 4G PLC无线通讯模块
  • 【MVC简介-产生原因、演变历史、核心思想、使用场景】
  • 有哪些开源的视频生成模型
  • [Windows] Escrcpy-1.29.2
  • 【测试】每日3道面试题 3/31
  • demo.launch(inbrowser=True, share=True)无法生成共享网址
  • 【力扣hot100题】(028)删除链表的倒数第N个节点
  • [C++] : C++11 右值引用的理解
  • Vue 2 和 Vue 3 有什么区别
  • 算法 | 2024最新算法:斑翠鸟优化算法原理,公式,应用,算法改进研究综述,matlab代码
  • 中山大学:从技术突破到场景落地 探索大模型发展与DeepSeek的创新应用|附下载方法
  • 深入理解指针5
  • 中医视角下的养生城市选择与候鸟式迁徙指南
  • 您需要了解的有关 Go、Rust 和 Zig 的信息
  • 我做了个开发者专用的设计app
  • 装饰器(Decorator)
  • C++之set,map容器
  • 领驭科技:以微软Azure Speech技术为核心,驱动翻译耳机新时代
  • 算法设计学习
  • 【信息茧房:当算法成为认知的隐形牢笼】
  • 几种常见的开源许可证
  • NLP高频面试题(二十八)——Reward model是如何训练的,怎么训练一个比较好的Reward model
  • P6327 区间加区间 sin 和 Solution
  • Neuralink API开发指南:用Python读取脑电信号控制智能家居
  • C++ unique_ptr、shared_ptr、weak_ptr全面解析
  • LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版