如何在不使用 Spring Boot 的情况下手动启动 Spring 应用容器

星静姑娘_5079

星静姑娘_5079

2026-11-14

227人浏览

原创

如何在不使用 Spring Boot 的情况下手动启动 Spring 应用容器

本文详解如何脱离 Spring Boot,通过原生 Spring Framework 手动构建并启动 ApplicationContext,完成依赖注入与组件管理,帮助初学者理解 IoC 容器本质。

本文详解如何脱离 spring boot,通过原生 spring framework 手动构建并启动 `applicationcontext`,完成依赖注入与组件管理,帮助初学者理解 ioc 容器本质。

Spring Boot 极大简化了 Spring 应用的启动流程,但其封装也掩盖了底层容器初始化的关键步骤。要真正理解 Spring 的控制反转(IoC)和依赖注入(DI)机制,必须亲手搭建原生 Spring 容器——这正是本文的核心目标。

✅ 正确启动方式:使用 AnnotationConfigApplicationContext

你不能通过 new TestSpringApplication() 创建实例,因为此时该对象完全游离于 Spring 容器之外,所有 @Autowired 字段自然为 null。Spring 的依赖注入只对由容器管理的 Bean 生效。因此,必须显式创建并刷新 ApplicationContext,再从中获取受管 Bean:

package com.cypherf;

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

@Configuration
@ComponentScan(basePackages = "com.cypherf") // 显式指定扫描路径
public class TestSpringApplication {

    public static void main(String[] args) {
        // 1️⃣ 创建基于注解的容器上下文
        try (AnnotationConfigApplicationContext context = 
                 new AnnotationConfigApplicationContext(TestSpringApplication.class)) {

            // 2️⃣ 从容器中获取已装配好的 Bean(推荐按类型获取)
            MessageService messageService = context.getBean(MessageService.class);
            MessageRepository messageRepository = context.getBean(MessageRepository.class);

            // 3️⃣ 执行业务逻辑(此时所有 @Autowired 已就绪)
            messageRepository.save(new Message("Message one"));
            messageRepository.save(new Message("Message two"));
            messageService.printAllMessages();
        }
    }
}

⚠️ 注意:TestSpringApplication 类本身仅作为配置类(@Configuration),不应包含业务逻辑字段(如 @Autowired private MessageService)。它不是被注入的目标 Bean,而是容器的“配置蓝图”。真正的业务 Bean(如 MessageService)应定义在独立的 @Service、@Repository 或 @Component 类中,并由 @ComponentScan 自动发现。

? 关键要点与常见误区

  • @Configuration ≠ 可注入的业务类:@Configuration 类用于声明 Bean 和配置元数据,其自身通常不参与 DI 链;若需在配置类中使用其他 Bean,应通过 @Bean 方法参数注入,而非字段注入。
  • 必须显式启用组件扫描:@ComponentScan 默认只扫描当前包及其子包,建议明确指定 basePackages,避免遗漏。
  • 资源管理:AnnotationConfigApplicationContext 实现了 AutoCloseable,推荐使用 try-with-resources 确保容器关闭时正确释放资源(如数据库连接池、线程池等)。
  • 无 CommandLineRunner 替代方案:Spring Boot 的 CommandLineRunner 是其扩展机制,原生 Spring 中可监听 ContextRefreshedEvent 事件实现类似效果:
@Component
public class StartupRunner implements ApplicationRunner {
    private final MessageService messageService;

    public StartupRunner(MessageService messageService) {
        this.messageService = messageService;
    }

    @Override
    public void run(ApplicationArguments args) {
        // 启动后执行逻辑
    }
}

⚠️ 但注意:ApplicationRunner 同样是 Spring Boot 特有接口。在纯 Spring 中,应改用 ApplicationListener。

Spring Boot Actuator Analyzer
Spring Boot Actuator Analyzer

分析Spring Boot Actuator端点的安全性、健康检查、指标暴露及生产配置——审计信息、健康状态和自定义端点。

下载

? 后续进阶:手动补全基础设施(如需)

若项目涉及数据库、事务、Web 等能力,需自行注册对应 Bean:

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(); // 示例:HikariCP 数据源
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("com.cypherf.model");
        // ... 配置 JPA Vendor、Hibernate 属性等
        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}

✅ 总结

脱离 Spring Boot 后,Spring 应用的启动流程回归本质三步:

  1. 创建容器 → new AnnotationConfigApplicationContext(...);
  2. 加载配置 → 通过 @Configuration + @ComponentScan 声明 Bean;
  3. 获取与使用 → context.getBean(...) 获取已注入的完整对象。

这个过程虽稍显繁琐,却清晰揭示了 Spring 的核心契约:容器即一切,Bean 由容器创建并装配,开发者只负责定义和获取。掌握它,才是深入 Spring 生态的真正起点。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

spring boot

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2991

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

517

25

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2991

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

517

25

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

40

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

40

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

20

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

140

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

100

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习