news 2026/3/6 8:33:06

【Spring】Spring Core解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring】Spring Core解析

深入了解Spring Core的核心原理、核心组件、实际使用方式以及底层逻辑,搞清楚它作为整个Spring生态基石的具体实现和价值。

Spring Core是Spring框架的根模块,也是所有Spring扩展框架(如Spring Boot、Spring MVC)的底层基础。它的核心使命是通过控制反转(IoC)依赖注入(DI)实现对象的解耦管理,彻底改变传统Java开发中对象创建和依赖管理的方式。下面我会从「核心思想」→「核心组件」→「实际使用」→「底层流程」逐层拆解,结合代码示例让你彻底理解。


一、Spring Core的核心思想:IoC & DI

这是Spring Core的灵魂,先把这两个概念讲透,后续所有内容都围绕它们展开。

1. 控制反转(IoC,Inversion of Control)

概念解释

传统Java开发中,程序员掌控对象的生命周期

// 传统方式:手动new对象,控制创建和依赖publicclassUserService{// 手动创建依赖的UserDao对象privateUserDaouserDao=newUserDaoImpl();publicvoidgetUser(){userDao.queryUser();}}

这种方式的问题:对象耦合度极高——如果UserDaoImpl的构造方式变了(比如需要传参数),所有new它的地方都要改;如果要替换UserDao的实现类(比如UserDaoMysqlImpl),也要逐个修改。

IoC的核心是反转控制权

  • 把对象的「创建、初始化、依赖注入、销毁」全部交给Spring IoC容器管理;
  • 程序员只需要「定义对象」和「声明依赖」,无需手动new对象。
通俗比喻

传统方式:你(程序员)亲自买菜、切菜、炒菜(手动创建所有对象);
IoC方式:你告诉餐厅(Spring容器)要吃什么菜(声明需要的对象),餐厅帮你准备好所有食材和餐具(创建对象+注入依赖),你只需要吃(使用对象)就行。

2. 依赖注入(DI,Dependency Injection)

概念解释

DI是IoC的具体实现方式:当Spring容器创建一个对象(比如UserService)时,会自动将它依赖的其他对象(比如UserDao)“注入”到这个对象中,无需程序员手动设置。

DI解决的核心问题:对象之间的依赖解耦——UserService不再关心UserDao是怎么创建的,只关心怎么使用它。


二、Spring Core的核心组件

Spring Core的核心是「IoC容器」,所有功能都围绕容器展开,核心组件如下:

1. Bean:Spring容器的管理单元

  • 定义:所有被Spring IoC容器管理的Java对象都叫Bean(本质就是普通的POJO,比如UserService、UserDao);
  • 区别:普通Java对象是new出来的,Bean是由Spring容器创建、管理、销毁的;
  • 标识:通过注解(@Component/@Service/@Repository/@Controller)或XML配置告诉Spring“这个类要被当作Bean管理”。

2. BeanFactory:IoC容器的根接口

  • 定位:定义了IoC容器的最基础规范(比如获取Bean、判断Bean是否存在、获取Bean类型等);
  • 核心方法getBean(String beanName)(根据名称获取Bean)、getBean(Class<T> requiredType)(根据类型获取Bean);
  • 特点
    • 轻量级,只实现了最核心的IoC功能;
    • 延迟初始化:只有调用getBean()时才创建Bean实例(节省内存,但启动快);
    • 实际开发中几乎不直接使用(功能太简单)。

3. ApplicationContext:BeanFactory的增强版(实际开发首选)

  • 定位:BeanFactory的子接口,是Spring最常用的IoC容器;
  • 扩展功能(相比BeanFactory):
    • 立即初始化:容器启动时就创建所有单例Bean(启动慢,但运行时响应快);
    • 支持国际化、资源加载(读取配置文件)、事件发布/监听;
    • 整合Spring AOP、事务管理等;
  • 常见实现类(开发中常用):
    实现类适用场景
    AnnotationConfigApplicationContext基于注解配置类的容器(主流)
    ClassPathXmlApplicationContext基于XML配置文件的容器(老旧项目)
    WebApplicationContextWeb环境下的容器(如Spring MVC)

4. BeanDefinition:Bean的“定义说明书”

  • 定位:Spring容器内部用来描述Bean的元数据(相当于Bean的“身份证”);
  • 包含信息:Bean的类型、作用域、依赖对象、初始化/销毁方法等;
  • 底层逻辑:Spring启动时,会先扫描所有Bean的定义(注解/XML),转换成BeanDefinition,再根据BeanDefinition创建Bean实例。

三、Spring Core的实际使用(代码示例)

下面通过完整的代码示例,演示Spring Core的核心用法(基于注解,主流方式)。

前置条件

  1. 新建Maven项目,引入Spring Core依赖(如果用Spring Boot,只需引入spring-boot-starter):
<!-- 纯Spring Core依赖 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.2</version><!-- 推荐使用稳定版 --></dependency></dependencies>

步骤1:定义Bean(声明需要被容器管理的对象)

// 1. 数据访问层Bean(@Repository是@Component的衍生注解,语义更明确)@RepositorypublicclassUserDao{publicvoidqueryUser(){System.out.println("查询用户信息");}}// 2. 业务层Bean(@Service同理)@ServicepublicclassUserService{// 声明依赖:需要UserDao对象privatefinalUserDaouserDao;// 推荐:构造器注入(Spring 4.3+支持自动注入,无需@Autowired)publicUserService(UserDaouserDao){this.userDao=userDao;}publicvoidgetUserInfo(){// 直接使用注入的UserDao,无需newuserDao.queryUser();}}

步骤2:配置IoC容器(告诉Spring扫描哪些包)

// 配置类:@Configuration标识这是Spring的配置类@Configuration// 组件扫描:告诉Spring扫描com.example包下的所有注解(@Service/@Repository等)@ComponentScan("com.example")publicclassSpringConfig{// 无需额外代码,扫描后Spring会自动创建Bean}

步骤3:启动容器并使用Bean

publicclassSpringCoreDemo{publicstaticvoidmain(String[]args){// 1. 创建ApplicationContext容器(基于注解配置)ApplicationContextcontext=newAnnotationConfigApplicationContext(SpringConfig.class);// 2. 从容器中获取UserService Bean(两种方式)// 方式1:根据类型获取(推荐)UserServiceuserService=context.getBean(UserService.class);// 方式2:根据名称获取(默认名称是类名首字母小写,如userService)// UserService userService = (UserService) context.getBean("userService");// 3. 使用BeanuserService.getUserInfo();// 输出:查询用户信息}}

依赖注入的3种方式(补充)

上面用了构造器注入(推荐),另外两种方式如下:

@ServicepublicclassUserService{// 方式1:字段注入(简单但不推荐,不利于单元测试)// @Autowired// private UserDao userDao;// 方式2:Setter注入(适合可选依赖)// private UserDao userDao;// @Autowired// public void setUserDao(UserDao userDao) {// this.userDao = userDao;// }// 方式3:构造器注入(推荐,强制依赖,确保对象创建时依赖已初始化)privatefinalUserDaouserDao;@Autowired// Spring 4.3+单构造器可省略publicUserService(UserDaouserDao){this.userDao=userDao;}}

四、Spring Core的核心细节

1. Bean的作用域(Scope)

Spring允许你指定Bean的创建策略,核心作用域如下(默认是singleton):

作用域说明
singleton单例(默认):容器中只有1个Bean实例,所有请求都返回同一个对象
prototype原型:每次调用getBean()或注入时,都创建新的Bean实例
requestWeb环境:每个HTTP请求创建1个Bean实例,请求结束后销毁
sessionWeb环境:每个HTTP会话创建1个Bean实例,会话结束后销毁

使用方式:通过@Scope注解指定:

@Service@Scope("prototype")// 原型作用域,每次获取都是新实例publicclassUserService{// ...}

2. Bean的生命周期(核心流程)

Spring容器创建Bean的完整流程,是理解Spring Core的关键:

flowchart TD A[实例化Bean]-->B[属性填充(DI注入依赖)]B -->C[初始化前(BeanPostProcessor前置处理)]C -->D[初始化(调用@PostConstruct/afterPropertiesSet)]D -->E[初始化后(BeanPostProcessor后置处理)]E -->F[Bean就绪(可被使用)]F -->G[容器关闭]G -->H[销毁前(调用@PreDestroy/destroy)]H -->I[销毁Bean]

代码示例(生命周期回调)

@ServicepublicclassUserServiceimplementsInitializingBean,DisposableBean{privatefinalUserDaouserDao;publicUserService(UserDaouserDao){this.userDao=userDao;System.out.println("1. 构造器执行:创建UserService实例");}// 初始化回调1:@PostConstruct注解(推荐)@PostConstructpublicvoidinit(){System.out.println("4. @PostConstruct:初始化操作");}// 初始化回调2:实现InitializingBean接口(备选)@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("4. afterPropertiesSet:初始化操作");}// 销毁回调1:@PreDestroy注解(推荐)@PreDestroypublicvoidpreDestroy(){System.out.println("8. @PreDestroy:销毁前操作");}// 销毁回调2:实现DisposableBean接口(备选)@Overridepublicvoiddestroy()throwsException{System.out.println("8. destroy:销毁前操作");}}

3. 自定义Bean(@Bean注解)

对于第三方类(比如Druid数据源、RedisTemplate),无法加@Component注解,可通过@Bean手动注册Bean:

@ConfigurationpublicclassSpringConfig{// 注册第三方类为Bean@Bean// 方法名默认是Bean名称,也可指定:@Bean("dataSource")publicDruidDataSourcedataSource(){DruidDataSourceds=newDruidDataSource();ds.setUrl("jdbc:mysql://localhost:3306/test");ds.setUsername("root");ds.setPassword("123456");returnds;}}

总结

  1. 核心思想:Spring Core的核心是IoC(反转对象控制权)和DI(自动注入依赖),彻底解耦对象创建和依赖管理;
  2. 核心容器:ApplicationContext是实际开发的首选IoC容器(增强版BeanFactory),负责Bean的创建、注入、销毁;
  3. 核心用法:通过@Component/@Service等注解声明Bean,构造器注入实现依赖解耦,@Configuration+@Bean管理第三方类;
  4. 关键细节:Bean的作用域(默认单例)、生命周期(初始化/销毁回调)是理解Spring Core底层的核心。

Spring Core的这些特性是所有Spring扩展框架的基础——比如Spring Boot的自动配置、Spring MVC的Controller管理,本质都是基于Spring Core的IoC容器实现的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 2:10:57

Yuzu模拟器版本管理终极指南:高效部署与智能切换实战技巧

Yuzu模拟器版本管理终极指南&#xff1a;高效部署与智能切换实战技巧 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 在Nintendo Switch模拟器领域&#xff0c;Yuzu凭借其出色的兼容性和持续优化的性能表现赢得了广…

作者头像 李华
网站建设 2026/3/3 17:00:52

Firecrawl MCP Server完整指南:为AI助手添加强大的网页抓取能力

如果你经常使用Cursor、Claude或其他AI工具&#xff0c;可能会发现它们无法直接访问网络内容。Firecrawl MCP Server正是为解决这个问题而生&#xff0c;它能让你的AI助手拥有实时网页抓取、内容提取和智能搜索的能力。 【免费下载链接】firecrawl-mcp-server Official Firecra…

作者头像 李华
网站建设 2026/3/2 19:01:35

基于PDR算法的室内连续定位APP:卡尔曼滤波轨迹优化技术实现无痕定位

基于PDR算法的室内定位app 使用行人轨迹推算算法进行连续定位 可以使用卡尔曼滤波&#xff0c;无痕卡尔曼滤波进行轨迹优化手机在商场里突然变哑巴&#xff1f;GPS信号被钢筋混凝土吃掉之后&#xff0c;室内定位就得靠黑科技了。今天咱们来盘盘用PDR&#xff08;行人航位推算&a…

作者头像 李华
网站建设 2026/3/3 13:04:20

如何快速使用Steamless:终极SteamStub DRM移除工具完全指南

如何快速使用Steamless&#xff1a;终极SteamStub DRM移除工具完全指南 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamless aims t…

作者头像 李华
网站建设 2026/3/1 18:52:18

终极跨平台苹方字体解决方案:让Windows用户也能享受苹果原生体验

终极跨平台苹方字体解决方案&#xff1a;让Windows用户也能享受苹果原生体验 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 还在为不同设备上字体显示效…

作者头像 李华
网站建设 2026/2/25 20:26:31

Qwen-Edit-2509多角度切换:AI图像编辑的镜头控制革命深度评测

Qwen-Edit-2509多角度切换&#xff1a;AI图像编辑的镜头控制革命深度评测 【免费下载链接】Qwen-Edit-2509-Multiple-angles 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Qwen-Edit-2509-Multiple-angles 你是否曾经为了一张图片需要拍摄多个角度而苦恼&#…

作者头像 李华