Spring 是 Java 生态系统中最流行的框架之一,提供了丰富的功能和模块,用于构建企业级应用。以下是 Spring、Spring Boot、Spring MVC 和 Spring Cloud 的知识汇总,涵盖了它们的基本概念、核心特性、使用场景和常见问题。
1. Spring 框架
1.1 基本概念
- 定义:Spring 是一个轻量级的开源框架,用于构建企业级应用。
- 核心特性:
- 依赖注入(DI):通过
@Autowired
或 XML 配置实现对象之间的依赖关系。 - 面向切面编程(AOP):通过切面实现横切关注点(如日志、事务管理)的模块化。
- 事务管理:支持声明式和编程式事务管理。
- 数据访问:提供对 JDBC、ORM(如 Hibernate)的支持。
- 依赖注入(DI):通过
1.2 核心模块
- Spring Core:提供依赖注入和 IoC 容器。
IoC(控制反转)是Spring的核心思想,通过依赖注入(DI)将对象的创建和依赖关系的管理交给Spring容器。 - Spring AOP:提供面向切面编程支持。
- Spring JDBC:简化 JDBC 操作。
JDBC连接数据库的步骤包括:加载驱动、建立连接、创建Statement、执行SQL、处理结果集、关闭连接。 - Spring ORM:集成 ORM 框架(如 Hibernate)。
- Spring Web:提供 Web 开发支持。
1.3 生命周期
Spring 生命周期是指 Spring 容器管理 Bean 的创建、初始化、使用和销毁的过程。
- Bean 定义加载:
Spring 容器加载 Bean 的定义(通过 XML、注解或 Java 配置)。 - 实例化(Instantiation):
Spring 容器根据配置或注解创建 Bean 的实例。
通过构造函数或工厂方法创建 Bean。 - 属性赋值(Population of Properties):
Spring 容器将配置的属性值或依赖注入到 Bean 中。
通过 @Autowired、@Value 或 XML 配置实现依赖注入。 - BeanPostProcessor 的前置处理:
调用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法。 - 初始化(Initialization):
Spring 容器调用 Bean 的初始化方法。
1)调用 @PostConstruct 注解的方法。
2)调用 InitializingBean 的 afterPropertiesSet 方法。
3)调用自定义的初始化方法(通过 XML 配置或 @Bean 的 initMethod 属性)。 - BeanPostProcessor 的后置处理:
调用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。 - 使用(In Use):
Bean 已经准备好,可以被应用程序使用。
应用程序通过 Spring 容器获取 Bean 并调用其方法。 - 销毁(Destruction):
Spring 容器在关闭时调用 Bean 的销毁方法。
1)调用 @PreDestroy 注解的方法。
2)调用 DisposableBean 的 destroy 方法。
3)调用自定义的销毁方法(通过 XML 配置或 @Bean 的 destroyMethod 属性)。
其中Bean 的实例化、属性赋值、初始化、使用和销毁为核心阶段。
1.4 Spring 生命周期的扩展点
Spring 提供了多个扩展点,允许开发者在 Bean 的生命周期中插入自定义逻辑。以下是常见的扩展点。
- BeanPostProcessor
作用:在 Bean 初始化前后执行自定义逻辑。
实现方法:
1)postProcessBeforeInitialization:在初始化之前调用。
2)postProcessAfterInitialization:在初始化之后调用。
示例:
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before Initialization: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After Initialization: " + beanName);
return bean;
}
}
- BeanFactoryPostProcessor
作用:在 Bean 工厂加载 Bean 定义之后、实例化 Bean 之前执行自定义逻辑。
实现方法:
1)postProcessBeanFactory:在 Bean 工厂加载 Bean 定义之后调用
示例:
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
System.out.println("BeanFactoryPostProcessor: Modifying bean definitions");
}
}
- InitializingBean 和 DisposableBean
作用:在 Bean 初始化和销毁时执行自定义逻辑。
实现方法:
1)afterPropertiesSet:在 Bean 初始化时调用。
2)destroy:在 Bean 销毁时调用。
示例:
public class CustomBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean: afterPropertiesSet");
}
@Override
public void destroy() {
System.out.println("DisposableBean: destroy");
}
}
- @PostConstruct 和 @PreDestroy
作用:在 Bean 初始化和销毁时执行自定义逻辑。
实现方法:
1)@PostConstruct:在 Bean 初始化时调用。
2)@PreDestroy:在 Bean 销毁时调用。
示例:
public class CustomBean {
@PostConstruct
public void init() {
System.out.println("@PostConstruct: init");
}
@PreDestroy
public void cleanup() {
System.out.println("@PreDestroy: cleanup");
}
}
1.5 使用场景
- 企业级应用:如 CRM、ERP 系统。
- Web 应用:如电商网站、社交平台。
2. Spring Boot
2.1 基本概念
- 定义:Spring Boot 是 Spring 的扩展,用于简化 Spring 应用的开发和部署。
- 核心特性:
- 自动配置:根据类路径和配置自动配置 Spring 应用。
- 嵌入式服务器:内置 Tomcat、Jetty 等服务器,无需单独部署。
- 起步依赖:通过
spring-boot-starter-*
简化依赖管理。 - Actuator:提供生产级监控和管理功能。
2.2 核心模块
- Spring Boot Starter:提供各种起步依赖。
- Spring Boot Actuator:提供应用监控和管理功能。
- Spring Boot CLI:提供命令行工具,快速创建和运行 Spring Boot 应用。
2.3 使用场景
- 微服务:快速构建和部署微服务应用。
- RESTful API:快速开发 RESTful API。
- 原型开发:快速构建和测试原型应用。
3. Spring MVC
3.1 基本概念
- 定义:Spring MVC 是 Spring 框架的一个模块,用于构建基于 MVC 模式的 Web 应用。
- 核心特性:
- 控制器(Controller):处理用户请求并返回视图或数据。
- 视图解析器(View Resolver):将逻辑视图名称解析为实际视图。
- 数据绑定:将请求参数绑定到模型对象。
- 表单处理:支持表单验证和数据绑定。
3.2 核心组件
- DispatcherServlet:前端控制器,负责请求的分发和处理。
- HandlerMapping:映射请求到处理器(Controller)。
- Controller:处理请求并返回模型和视图。
- ViewResolver:解析视图名称并返回实际视图。
3.3 使用场景
- Web 应用:如电商网站、社交平台。
- RESTful API:提供 RESTful 接口。
4. Spring Cloud
4.1 基本概念
- 定义:Spring Cloud 是 Spring 的扩展,用于构建分布式系统和微服务架构。
- 核心特性:
- 服务发现:通过 Eureka 或 Consul 实现服务注册与发现。
- 负载均衡:通过 Ribbon 实现客户端负载均衡。
- 配置管理:通过 Spring Cloud Config 实现集中式配置管理。
- 断路器:通过 Hystrix 实现故障容错。
4.2 核心模块
- Spring Cloud Netflix:集成 Netflix OSS(如 Eureka、Hystrix)。
- Spring Cloud Config:提供集中式配置管理。
- Spring Cloud Gateway:提供 API 网关功能。
- Spring Cloud Sleuth:提供分布式跟踪功能。
4.3 使用场景
- 微服务架构:构建和部署微服务应用。
- 分布式系统:如电商平台、金融系统。
5. 常见问题与解决方案
5.1 Spring 中的循环依赖
- 问题:两个或多个 Bean 相互依赖,导致无法正确注入。
- 解决方案:
- 使用
@Lazy
延迟加载。 - 使用
@Autowired
的setter
方法注入。
- 使用
5.2 Spring Boot 自动配置失效
- 问题:自动配置未按预期工作。
- 解决方案:
- 检查类路径和配置。
- 使用
@EnableAutoConfiguration
或@SpringBootApplication
启用自动配置。
5.3 Spring MVC 中的跨域问题
- 问题:前端请求跨域时被浏览器阻止。
- 解决方案:
- 使用
@CrossOrigin
注解启用跨域支持。 - 配置
CorsFilter
或WebMvcConfigurer
。
- 使用
5.4 Spring Cloud 中的服务发现失败
- 问题:服务无法注册到 Eureka 或 Consul。
- 解决方案:
- 检查服务配置和网络连接。
- 确保 Eureka 或 Consul 服务正常运行。
6. 最佳实践
6.1 使用 Spring Boot 简化开发
- 实践:使用 Spring Boot 的起步依赖和自动配置,快速构建和部署应用。
6.2 使用 Spring Cloud 构建微服务
- 实践:使用 Spring Cloud 的服务发现、负载均衡和配置管理,构建分布式系统。
6.3 使用 Spring MVC 构建 RESTful API
- 实践:使用 Spring MVC 的注解和功能,快速开发 RESTful API。
6.4 使用 Spring AOP 实现横切关注点
- 实践:使用 Spring AOP 实现日志、事务管理等横切关注点。
总结
- Spring:提供依赖注入、AOP、事务管理等核心功能。
- Spring Boot:简化 Spring 应用的开发和部署,支持自动配置和嵌入式服务器。
- Spring MVC:用于构建基于 MVC 模式的 Web 应用和 RESTful API。
- Spring Cloud:用于构建分布式系统和微服务架构,提供服务发现、负载均衡、配置管理等功能。