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下。