欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > SpringBoot框架—classpath、Bean、容器的概念

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

2025/4/2 21:50:29 来源:https://blog.csdn.net/weixin_42476668/article/details/145784892  浏览:    关键词: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下。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词