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

2026-01-14 18:03:41

一、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复制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 容器将对象所依赖的其他对象(依赖)注入到该对象中。

注入方式基于构造函数注入 (Constructor Injection)基于 Setter 方法注入 (Setter Injection)基于字段注入 (Field Injection) —— 不推荐(破坏封装性,不利于测试)四、入门使用:从零开始搭建一个 Spring 项目我们将使用 Maven 作为构建工具,创建一个简单的 Spring 控制台应用。

4.1 创建 Maven 项目代码语言:javascript复制

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">

4.0.0

com.example

spring-demo

1.0-SNAPSHOT

jar

11

11

5.3.21

org.springframework

spring-context

${spring.version}

org.springframework

spring-core

${spring.version}

org.slf4j

slf4j-simple

1.7.36

4.2 定义业务组件代码语言:javascript复制// 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复制

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">

方式二:基于 Java 注解配置 (推荐)代码语言:javascript复制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复制// 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复制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复制// 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复制使用数据源 [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复制

org.springframework

spring-aop

${spring.version}

org.aspectj

aspectjweaver

1.9.7

6.3 定义切面 (Aspect)代码语言:javascript复制// 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复制@Configuration

@ComponentScan(basePackages = "com.example")

@EnableAspectJAutoProxy // 启用 AspectJ 自动代理

public class AppConfig {

}再次运行 App 类,输出:

代码语言:javascript复制深色版本[AOP 日志] 方法执行前...

使用数据源 [Oracle] 保存用户: 张三

[AOP 日志] 方法执行后...七、总结Spring 是一个强大的企业级开发框架,核心是 IoC/DI 和 AOP。IoC/DI 解决了对象创建和依赖管理的问题,实现了松耦合。AOP 解决了横切关注点的模块化问题,提高了代码复用性。现代 Spring 开发 主要使用 Java 注解 和 Java 配置类,避免了繁琐的 XML 配置。Spring Boot 是 Spring 的延伸,它通过“约定优于配置”的理念,进一步简化了 Spring 应用的开发,是当前最主流的 Spring 应用开发方式。下一步建议:学习 Spring Boot,它将让你的 Spring 开发体验更上一层楼!

资源星图