首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring 全面详解:最全最详细的 Spring 基本认识和入门使用

Spring 全面详解:最全最详细的 Spring 基本认识和入门使用

原创
作者头像
技术文章分析
发布2025-09-21 15:08:27
发布2025-09-21 15:08:27
34200
代码可运行
举报
运行总次数:0
代码可运行

一、Spring 是什么?—— 基本认识

1.1 定义

Spring 是一个开源的 轻量级、非侵入式Java EE(现 Jakarta EE)开发框架,由 Rod Johnson 在 2003 年创建,并于 2004 年发布 1.0 版本。它旨在简化企业级 Java 应用开发

1.2 核心目标

  • 简化开发:通过提供一系列工具和抽象,减少样板代码(boilerplate code)。
  • 解耦:降低应用程序组件之间的耦合度,提高可维护性和可测试性。
  • 集成:提供对各种企业级技术(如数据库、消息队列、安全、Web 等)的无缝集成。

1.3 为什么使用 Spring?

  • IoC (控制反转):管理对象的创建和依赖关系,开发者无需手动 new 对象。
  • AOP (面向切面编程):实现横切关注点(如日志、事务、安全)的模块化。
  • 丰富的功能:涵盖数据访问、事务管理、MVC Web 框架、测试、安全等。
  • 强大的社区和生态系统:拥有庞大的用户群体、丰富的文档和第三方库支持。
  • 与主流技术无缝集成:如 Hibernate, MyBatis, Redis, Kafka, Elasticsearch 等。
  • Spring Boot:极大地简化了 Spring 应用的初始搭建和开发过程。
代码语言:javascript
代码运行次数:0
运行
复制
ZB.BAIKEYOU.CN23丨FREE.HNTGNETWORK.COM37丨MOBI.CHUANZHIWANG.CN42丨R.KQW.INFO11
WWW.25MP.CN37丨MOBI.KAIGUIJITUAN.COM31丨JIM.KIN168.CN58丨SWEET.WKSKJX.CN10
24K.HZXXX168.COM75丨FOOTBALL.JPPKIUEDU.COM10丨WWW.BMXXW.NET40丨LANQIU.CBAZHIBO.MOBI96
ZBSJB.SNQCZ.COM50丨ZHIBO.WHDHX.CN43丨SOHU.28BAIKE.COM96丨SOHU.XLSY.CN74
24K.LSLJX.COM97丨SHARE.CDYIBEINENGYUAN.COM32丨SOHU.JXLGDL.COM12丨VIP.CHANGTAI333.COM89
FREE.HZSMC.COM11丨PRETTY.CHRONOPORTAL.CN14丨ZHIHU.JLDXQ.COM38丨CCTV.CLQMW.COM24
ZBSJB.XJQQMAIL.COM37丨FREE.QIRUI4.COM39丨CCTV.QDSKYWGJJNG.COM69丨ZHIBO.WKSKJX.CN99
24K.PENCITY.CN38丨WEIBO.NJZHONGTONG.COM32丨WAP.HNTGNETWORK.COM18丨QQ.XLTS2000.CN38
ZUQIU.HONGDA0536.CN15丨24K.XMJIUSHI.CN58丨JRS.ZHIXINQG.COM73丨SOHU.CYDDW.CN89
YES.ABFYBJ.COM46丨VIP.SZJDZSH.COM12丨ZHIBO.QZSYHB.CN24丨ZHIBO.0518XZW.COM50
24K.DGRYMY.CN83丨PRETTY.BOKEZHI.COM97丨VIP.25MP.CN13丨ZHIBO.PCFANGYUANKOU.COM39
ZB.CHANGTAI120.CN16丨JRS.SDDANTUOJI.CN77丨R.XVU.INFO83丨MAP.NMGZIXUN.ORG.CN83

二、Spring 的核心架构

Spring 框架由多个模块组成,核心模块包括:

模块

功能

Spring Core Container

核心容器,包含 IoC 和 DI 功能。

├── Beans

定义了 BeanFactory,是 IoC 容器的核心。

├── Core

提供框架基本组成部分,如 IoC 和 DI。

├── Context

构建于 Core 和 Beans 模块之上,提供上下文信息(ApplicationContext)。

└── SpEL (Spring Expression Language)

运行时查询和操作对象图的表达式语言。

AOP and Instrumentation

提供 AOP 支持,用于声明式事务管理、日志等。

Messaging

支持 STOMP 和 WebSocket。

Data Access/Integration

JDBC, ORM (JPA, Hibernate, MyBatis), OXM, JMS, Transactions

Web

Servlet-based Spring MVC 和 WebSocket。

Test

支持使用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试。

注意:从 Spring 5.0 开始,引入了 WebFlux 模块,支持响应式编程模型。


三、核心概念详解

3.1 IoC (Inversion of Control) - 控制反转

  • 传统方式:对象 A 需要对象 B,A 会主动 new B() 来创建 B 的实例。
  • IoC 方式:对象 A 不再负责创建 B,而是将创建 B 的控制权“反转”给一个第三方(Spring 容器)。容器负责创建 B 并注入到 A 中。
  • 好处:降低了类之间的耦合度,提高了代码的灵活性和可测试性。

3.2 DI (Dependency Injection) - 依赖注入

DI 是 IoC 的一种实现方式。它指的是 Spring 容器将对象所依赖的其他对象(依赖)注入到该对象中。

注入方式
  1. 基于构造函数注入 (Constructor Injection)
  2. 基于 Setter 方法注入 (Setter Injection)
  3. 基于字段注入 (Field Injection) —— 不推荐(破坏封装性,不利于测试)

四、入门使用:从零开始搭建一个 Spring 项目

我们将使用 Maven 作为构建工具,创建一个简单的 Spring 控制台应用。

4.1 创建 Maven 项目

代码语言:javascript
代码运行次数:0
运行
复制
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>spring-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring.version>5.3.21</spring.version> <!-- 或更高版本 -->
    </properties>

    <dependencies>
        <!-- Spring Context (包含 Core, Beans, Context) -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- Spring Core (包含 SpEL) -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- 日志 (Spring 依赖 Commons Logging, 通常桥接到 SLF4J) -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
        </dependency>
    </dependencies>
</project>

4.2 定义业务组件

代码语言:javascript
代码运行次数:0
运行
复制
// com/example/service/UserService.java
package com.example.service;

public interface UserService {
    void saveUser(String username);
}

// com/example/service/impl/UserServiceImpl.java
package com.example.service.impl;

import com.example.service.UserService;

public class UserServiceImpl implements UserService {
    private String dataSource; // 模拟依赖

    // 构造函数注入
    public UserServiceImpl(String dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public void saveUser(String username) {
        System.out.println("使用数据源 [" + dataSource + "] 保存用户: " + username);
    }
}

4.3 配置 Spring 容器

方式一:基于 XML 配置 (传统方式)
代码语言:javascript
代码运行次数:0
运行
复制
<!-- src/main/resources/applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 定义一个 Bean -->
    <bean id="userService" class="com.example.service.impl.UserServiceImpl">
        <!-- 通过构造函数注入参数 -->
        <constructor-arg value="MySQL"/>
    </bean>

</beans>
方式二:基于 Java 注解配置 (推荐)
代码语言:javascript
代码运行次数:0
运行
复制
java深色版本// com/example/config/AppConfig.java
package com.example.config;

import com.example.service.UserService;
import com.example.service.impl.UserServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 标记这是一个配置类
public class AppConfig {

    @Bean // 声明一个 Bean
    public UserService userService() {
        return new UserServiceImpl("PostgreSQL"); // 构造函数注入
    }
}
方式三:基于 Java 配置类 + 组件扫描 (最常用)

修改 UserServiceImpl

代码语言:javascript
代码运行次数:0
运行
复制
// com/example/service/impl/UserServiceImpl.java
package com.example.service.impl;

import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service // 声明这是一个服务组件,会被 Spring 扫描到
public class UserServiceImpl implements UserService {

    @Value("Oracle") // 注入一个简单的值
    private String dataSource;

    @Override
    public void saveUser(String username) {
        System.out.println("使用数据源 [" + dataSource + "] 保存用户: " + username);
    }
}
代码语言:javascript
代码运行次数:0
运行
复制
java深色版本// com/example/config/AppConfig.java
package com.example.config;

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

@Configuration
@ComponentScan(basePackages = "com.example") // 扫描指定包下的所有组件
public class AppConfig {
    // 不需要显式声明 Bean,@Service 已经声明了
}

4.4 启动应用并使用 Spring 容器

代码语言:javascript
代码运行次数:0
运行
复制
// com/example/App.java
package com.example;

import com.example.config.AppConfig;
import com.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
// 如果使用 XML: import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 方式1: 使用 Java 配置类
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 方式2: 使用 XML 配置文件
        // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 从容器中获取 Bean
        UserService userService = context.getBean(UserService.class);
        // 或者通过名称获取: context.getBean("userService", UserService.class)

        // 使用 Bean
        userService.saveUser("张三");

        // 关闭容器 (对于 Web 应用通常不需要手动关闭)
        ((AnnotationConfigApplicationContext) context).close();
    }
}

输出

代码语言:javascript
代码运行次数:0
运行
复制
使用数据源 [Oracle] 保存用户: 张三

五、常用注解速查表

注解

用途

所在模块

@Component

通用组件注解

spring-context

@Service

服务层组件

spring-context

@Repository

数据访问层 (DAO) 组件,能捕获持久化异常

spring-context

@Controller

表现层 (Web) 组件

spring-web

@RestController

@Controller + @ResponseBody,用于 RESTful API

spring-web

@Configuration

声明配置类

spring-context

@Bean

在配置类中声明一个 Bean

spring-context

@ComponentScan

启用组件扫描

spring-context

@Autowired

自动装配依赖(构造函数、Setter、字段)

spring-beans

@Qualifier

当有多个相同类型的 Bean 时,指定名称进行注入

spring-beans

@Value

注入属性值(字面量、SpEL 表达式)

spring-beans

@Scope

定义 Bean 的作用域 (singleton, prototype 等)

spring-beans

@Primary

当有多个候选 Bean 时,优先选择此 Bean

spring-beans

@PostConstruct

定义初始化方法

javax.annotation

@PreDestroy

定义销毁前方法

javax.annotation


六、AOP (面向切面编程) 入门

6.1 什么是 AOP?

AOP 允许你将横切关注点(如日志、事务、安全)从业务逻辑中分离出来,以声明式的方式应用到多个地方。

6.2 添加 AOP 依赖

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.7</version>
</dependency>

6.3 定义切面 (Aspect)

代码语言:javascript
代码运行次数:0
运行
复制
// com/example/aspect/LoggingAspect.java
package com.example.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // 定义切入点:匹配 UserService 中的所有方法
    @Pointcut("execution(* com.example.service.UserService.*(..))")
    public void userServiceMethods() {}

    @Before("userServiceMethods()")
    public void logBefore() {
        System.out.println("[AOP 日志] 方法执行前...");
    }

    @After("userServiceMethods()")
    public void logAfter() {
        System.out.println("[AOP 日志] 方法执行后...");
    }
}

6.4 启用 AspectJ 自动代理

AppConfig.java 中添加:

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy // 启用 AspectJ 自动代理
public class AppConfig {
}

再次运行 App 类,输出

代码语言:javascript
代码运行次数:0
运行
复制
深色版本[AOP 日志] 方法执行前...
使用数据源 [Oracle] 保存用户: 张三
[AOP 日志] 方法执行后...

七、总结

  • Spring 是一个强大的企业级开发框架,核心是 IoC/DIAOP
  • IoC/DI 解决了对象创建和依赖管理的问题,实现了松耦合。
  • AOP 解决了横切关注点的模块化问题,提高了代码复用性。
  • 现代 Spring 开发 主要使用 Java 注解Java 配置类,避免了繁琐的 XML 配置。
  • Spring Boot 是 Spring 的延伸,它通过“约定优于配置”的理念,进一步简化了 Spring 应用的开发,是当前最主流的 Spring 应用开发方式。

下一步建议:学习 Spring Boot,它将让你的 Spring 开发体验更上一层楼!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Spring 是什么?—— 基本认识
    • 1.1 定义
    • 1.2 核心目标
    • 1.3 为什么使用 Spring?
  • 二、Spring 的核心架构
  • 三、核心概念详解
    • 3.1 IoC (Inversion of Control) - 控制反转
    • 3.2 DI (Dependency Injection) - 依赖注入
      • 注入方式
  • 四、入门使用:从零开始搭建一个 Spring 项目
    • 4.1 创建 Maven 项目
    • 4.2 定义业务组件
    • 4.3 配置 Spring 容器
      • 方式一:基于 XML 配置 (传统方式)
      • 方式二:基于 Java 注解配置 (推荐)
      • 方式三:基于 Java 配置类 + 组件扫描 (最常用)
    • 4.4 启动应用并使用 Spring 容器
  • 五、常用注解速查表
  • 六、AOP (面向切面编程) 入门
    • 6.1 什么是 AOP?
    • 6.2 添加 AOP 依赖
    • 6.3 定义切面 (Aspect)
    • 6.4 启用 AspectJ 自动代理
  • 七、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档