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">
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">
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复制
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 开发体验更上一层楼!
资源星图