Spring框架是2003年兴起的一个轻量级Java开发框架,由Rod Johnson在其经典著作中阐述的理念衍生而来,旨在解决企业应用开发的复杂性。作为分层的JavaSE/EE一站式轻量级开源框架,Spring的核心是控制反转(IOC)和面向切面(AOP)

Spring


一、Spring框架概述

1.1 什么是Spring框架

Spring框架是一个开源的Java平台,由Rod Johnson在2003年创建。它提供了一个全面的编程和配置模型,用于构建现代基于Java的企业应用程序。

1
Spring的核心价值:
  • 简化Java开发:通过依赖注入和面向切面编程简化企业级应用开发
  • 解耦和模块化:帮助开发者编写松耦合、可测试的代码
  • 企业级功能:提供事务管理、安全、缓存等企业级功能
  • 一站式解决方案:覆盖表现层、业务层、持久层

1.2 Spring框架的优势

1
1. 低侵入设计:
  • 代码污染极低
  • 不需要继承特定的类或实现特定的接口
  • 可以自由选择使用Spring的哪些功能
1
2. 依赖注入(DI):
  • IOC(控制反转)的核心机制
  • 提供了bean工厂(Spring容器)
  • 降低了业务对象替换的复杂性
  • 提高了组件之间的解耦
1
3. 面向切面编程(AOP):
  • 将通用任务(安全、事务、日志等)集中管理
  • 提高了代码复用性和管理的便捷性
  • 业务逻辑与横切关注点分离
1
4. 框架整合:
  • ORM和DAO提供了与第三方持久层框架的良好整合
  • 简化了底层数据访问
  • 支持Hibernate、MyBatis、JPA等
1
5. Web MVC框架:
  • 提供了优秀的Web MVC框架
  • 支持RESTful API开发
  • 灵活的视图解析
1
6. 企业级功能:
  • 数据库事务处理
  • 远程调用(RMI、Hessian、HTTP)
  • JMS消息处理
  • JMX操作处理
  • 不需要直接使用相关API(JDBC、JMX、JMS等)

1.3 Spring生态系统

1
核心框架:
  • Spring Framework:核心框架
  • Spring Boot:快速开发框架
  • Spring Cloud:微服务框架
  • Spring Data:数据访问抽象
1
相关项目:
  • Spring Security:安全框架
  • Spring Batch:批处理框架
  • Spring Integration:企业集成框架
  • Spring AMQP:消息队列支持

二、Spring核心概念

2.1 IOC(控制反转)

1
IOC定义:

IOC(Inversion of Control)即控制反转,多数书籍翻译成”控制反转”,还有些书籍翻译成为”控制反向”或者”控制倒置”。

1
传统方式 vs IOC方式:
1
传统方式:
1
2
3
4
5
6
7
8
// 传统方式:对象自己创建依赖
public class UserService {
private UserRepository userRepository;

public UserService() {
this.userRepository = new UserRepositoryImpl(); // 硬编码依赖
}
}
1
IOC方式:
1
2
3
4
5
6
// IOC方式:依赖由容器注入
@Service
public class UserService {
@Autowired
private UserRepository userRepository; // 依赖注入
}
1
IOC的优势:
  • 降低组件之间的耦合度
  • 提高代码的可测试性
  • 便于替换实现
  • 统一管理对象生命周期
  • 不需要主动查找,对象的查找、定位和创建全部由容器管理

2.2 DI(依赖注入)

1
DI定义:

DI(Dependency Injection)即依赖注入,是IOC的一种实现方式。Spring的IOC容器主要使用DI方式实现。

1
依赖注入方式:
1
1. 构造器注入(推荐):
1
2
3
4
5
6
7
8
@Service
public class UserService {
private final UserRepository userRepository;

public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
1
2. Setter注入:
1
2
3
4
5
6
7
8
9
@Service
public class UserService {
private UserRepository userRepository;

@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
1
3. 字段注入:
1
2
3
4
5
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}

2.3 AOP(面向切面编程)

1
AOP定义:

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

1
AOP应用场景:
  • 日志记录:方法执行前后记录日志
  • 事务管理:自动管理事务的开启、提交、回滚
  • 权限控制:方法执行前检查权限
  • 性能监控:统计方法执行时间
  • 异常处理:统一异常处理
1
AOP示例:
1
2
3
4
5
6
7
8
9
@Aspect
@Component
public class LoggingAspect {

@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("执行方法: " + joinPoint.getSignature().getName());
}
}

三、Spring 框架的20个模块

Spring


1
Spring IOC:

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,spring的IOC容器主要使用DI方式实现的。不需要主动查找,对象的查找、定位和创建全部由容器管理。spring ioc 是spring的核心,在spring中主要用户管理容器中的bean。

1
Spring AOP:

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。spring aop 也是spring的核心,利用aop的技术可以用来做日志、权限、缓存等功能实现。

1
Spring ORM:

Spring支持大多数ORM框架,比如Hibernate,JPA,JDO,TopLink和iBatis(spring2支持iBatis2,现MyBatis3的spring支持由MyBatis社区开发,并非spring)。

1
Spring MVC:

Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,spring MVC和Struts、Struts2非常类似。

1
Spring Webservice:

Spring 支持集成Apache cxf、axis2、xfire等不同集中webservice实现方案。

1
Spring Transaction:

Spring完美的支持了对事物的管理,目前主要有两种实现发难,一种是配置文件、一种是基于注解来实现。


1
Spring JMS:

Spring支持对activemq、RabbitMQ消息中间件的集成。

1
Spring Data:

Spring Data 作为springSource的其中一个父项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。

1
Spring Cache:

Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。

1
Spring Boot:

Spring-Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

1
Spring Security:

Spring Security是一个能够为基于spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在spring应用上下文中配置的Bean,充分利用了spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

1
Spring Schedule:

Spring在schedule这块支持JDK Timer、concurrent、quartz三种,这三种任务调度方案在实现机制和调用方法上都不同,但spring通过对其包装,使得基于spring能用统一的配置和编码风格来使用这三种schedule方案。

四、第一个Spring应用

4.1 创建Maven项目

1
pom.xml配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>spring-demo</artifactId>
<version>1.0.0</version>

<properties>
<spring.version>5.3.21</spring.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>

<dependencies>
<!-- Spring Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>

4.2 创建Bean类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// User.java
public class User {
private String name;
private Integer age;

// Getters and Setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }

public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}

// UserService.java
public class UserService {
public void sayHello(User user) {
System.out.println("Hello, " + user.getName() + "!");
}
}

4.3 配置Spring

1
XML配置方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 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
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="com.example.User">
<property name="name" value="张三"/>
<property name="age" value="25"/>
</bean>

<bean id="userService" class="com.example.UserService"/>
</beans>
1
Java配置方式(推荐):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {

@Bean
public User user() {
User user = new User();
user.setName("张三");
user.setAge(25);
return user;
}

@Bean
public UserService userService() {
return new UserService();
}
}

4.4 使用Spring容器

1
2
3
4
5
6
7
8
9
10
11
// 使用XML配置
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user", User.class);
UserService userService = context.getBean("userService", UserService.class);
userService.sayHello(user);

// 使用Java配置
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
User user = context.getBean(User.class);
UserService userService = context.getBean(UserService.class);
userService.sayHello(user);

五、Spring注解开发

5.1 常用注解

1
组件注解:
1
2
3
4
@Component      // 通用组件
@Service // 服务层组件
@Repository // 数据访问层组件
@Controller // 控制器组件
1
依赖注入注解:
1
2
3
4
@Autowired      // 自动装配
@Qualifier // 指定Bean名称
@Resource // JSR-250注解
@Value // 注入值
1
配置注解:
1
2
3
4
@Configuration  // 配置类
@Bean // 定义Bean
@ComponentScan // 组件扫描
@PropertySource // 属性源

5.2 注解示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 配置类
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

// 服务类
@Service
public class UserService {
@Autowired
private UserRepository userRepository;

public User findById(Long id) {
return userRepository.findById(id);
}
}

// 数据访问类
@Repository
public class UserRepository {
public User findById(Long id) {
// 实现查询逻辑
return new User();
}
}

六、框架源码解析

6.1 框架版本

1
当前版本:
  • spring-framework-5.0.6.RELEASE(示例版本)
  • 最新版本:Spring 6.x(需要Java 17+)
  • 推荐版本:Spring 5.3.x(稳定版本)

6.2 核心包结构

Spring的骨架,也是Spring的核心包。主要包含三个内容:

1
1. Beans(Bean实例):
  • beans包更侧重于bean实例的描述
  • 负责Bean的定义、创建、管理
  • 类比:演员
1
2. Context(上下文):
  • context更侧重全局控制,功能衍生
  • 提供Spring框架的上下文环境
  • 类比:导演
1
3. Core(核心工具):
  • core包侧重于帮助类,操作工具
  • 提供Spring框架的基础工具类
  • 类比:道具

Spring

6.3 源码结构

1
核心包结构:
1
2
3
4
5
6
7
8
9
10
11
12
spring-framework/
├── spring-core/ # 核心工具类
├── spring-beans/ # Bean定义和管理
├── spring-context/ # 应用上下文
├── spring-aop/ # AOP支持
├── spring-expression/ # SpEL表达式
├── spring-jdbc/ # JDBC支持
├── spring-orm/ # ORM支持
├── spring-tx/ # 事务支持
├── spring-web/ # Web支持
├── spring-webmvc/ # MVC框架
└── spring-test/ # 测试支持

Spring

6.4 Beans包(实例)

1
Beans包核心类:
  • BeanDefinition:Bean定义接口
  • BeanFactory:Bean工厂接口
  • BeanWrapper:Bean包装器
  • PropertyAccessor:属性访问器

Spring

6.5 Context包(上下文)

1
Context包核心类:
  • ApplicationContext:应用上下文接口
  • ConfigurableApplicationContext:可配置上下文
  • BeanPostProcessor:Bean后处理器
  • ApplicationEventPublisher:事件发布器

Spring

6.6 Core包(核心工具)

1
Core包核心类:
  • Resource:资源抽象接口
  • ResourceLoader:资源加载器
  • BeanDefinitionRegistry:Bean定义注册器
  • BeanDefinitionReader:Bean定义读取器
6.6.1 Registry(描述注册器)

Spring

6.6.2 Strategy(初始化策略)

Spring

七、下一步学习

通过本文的学习,您已经掌握了Spring框架的基础知识,包括:

  • Spring框架的核心概念(IOC、DI、AOP)
  • Spring框架的模块组成
  • Spring的基本使用和配置
  • Spring注解开发
  • Spring框架源码结构

在下一篇文章(进阶篇)中,我们将深入学习Spring框架的高级特性,包括AOP深入、事务管理、Bean生命周期、性能优化等内容。

1
2
3
4
参考资源:
- [Spring框架源码](https://github.com/Hosiang1026/spring-framework)
- [简单的Spring框架实现](https://github.com/Hosiang1026/simple-spring)
- [Spring官方文档](https://spring.io/projects/spring-framework)

本文标题: Spring框架入门篇

发布时间: 2023年01月28日 00:00

最后更新: 2025年12月30日 08:54

原始链接: https://haoxiang.eu.org/21e862e1/

版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

× 喜欢就赞赏一下呗!
打赏二维码