Spring 是轻量级、松散耦合的开源应用框架,通过控制反转(IOC)和面向切面编程(AOP)降低应用开发复杂度。
| 优点 | 说明 |
|---|
| 轻量级 | 代码量和透明度方面都很轻便 |
| IOC/DI | 控制反转和依赖注入,降低耦合 |
| AOP | 面向切面编程支持 |
| 容器 | 管理对象的完整生命周期 |
| 事务管理 | 统一的事务管理抽象层 |
| 模块 | 说明 |
|---|
| Spring Core | 核心容器,提供 IOC 和依赖注入 |
| Spring Bean | Bean 定义和管理 |
| Spring Context | 企业级服务(JNDI、EJB) |
| SpEL | Spring 表达式语言 |
| Spring AOP | 面向切面编程 |
| Spring JDBC | JDBC 抽象层 |
| Spring ORM | Hibernate、JPA 集成 |
| Spring MVC | Web 应用框架 |
| Spring Test | JUnit、TestNG 支持 |
IOC(Inversion of Control)的核心思想:对象的创建和依赖关系由容器管理,而非程序员手动创建。
Spring IOC 的实现原理是工厂模式 + 反射机制。
| 特性 | BeanFactory | ApplicationContext |
|---|
| 加载方式 | 懒加载 | 即时加载 |
| 国际化 | 不支持 | 支持 |
| 注解装配 | 不支持 | 支持 |
| Web 支持 | 基本功能 | 完整支持 |
提示
推荐 ApplicationContext 是 BeanFactory 的超集,生产环境推荐使用。
| 特性 | 构造函数注入 | Setter 注入 |
|---|
| 依赖数量 | 全部注入 | 部分注入 |
| 是否覆盖 | 不覆盖 | 会覆盖 |
| 适用场景 | 强制依赖 | 可选依赖 |
| 方式 | 说明 |
|---|
| no | 默认,不自动装配 |
| byName | 根据 bean 名称匹配 |
| byType | 根据类型匹配 |
| constructor | 通过构造函数 |
| autodetect | 先构造器,后 byType |
注意
自动装配局限 无法自动装配简单类型(int、String),精度不如显式装配,可被显式配置覆盖。
| 方式 | 说明 |
|---|
| XML 配置 | 传统 XML 配置文件 |
| 注解配置 | @Component、@Service 等 |
| Java API | @Configuration + @Bean |
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
| 作用域 | 说明 |
|---|
| singleton | 每个 IOC 容器一个实例(默认) |
| prototype | 每次请求创建新实例 |
| request | 每次 HTTP 请求一个实例 |
| session | 每次 HTTP Session 一个实例 |
实例化 → 属性填充 → Aware 接口回调
→ BeanPostProcessor 前置处理 → InitializingBean / init-method
→ BeanPostProcessor 后置处理 → 就绪
→ DisposableBean / destroy-method
| 注解 | 说明 |
|---|
@Component | 通用组件 |
@Controller | Web MVC 控制器 |
@Service | 业务逻辑层 |
@Repository | DAO 层,自动异常转换 |
| 注解 | 说明 |
|---|
@Autowired | 按类型自动注入 |
@Qualifier | 指定具体 bean 名称 |
@Resource | 按名称或类型注入 |
AOP(Aspect-Oriented Programming)将业务逻辑和系统服务(日志、事务、安全)分离。
| 概念 | 说明 |
|---|
| Aspect | 切面,包含通知和切点 |
| JoinPoint | 连接点,程序执行的时间点 |
| PointCut | 切点,定位连接点的表达式 |
| Advice | 通知,切点执行的增强动作 |
| Weaving | 织入,将切面应用到目标对象 |
| 类型 | 说明 |
|---|
@Before | 前置通知 |
@AfterReturning | 后置通知,方法正常返回后 |
@AfterThrowing | 异常通知 |
@After | 最终通知,无论如何执行 |
@Around | 环绕通知,方法前后都执行 |
提示
Spring AOP vs AspectJ Spring AOP 基于动态代理,只支持方法级别拦截;AspectJ 编译时织入,支持字段级别拦截,功能更强大。
| 类型 | 说明 |
|---|
| 静态代理 | 编译时增强,使用特殊编译器 |
| 动态代理 | 运行时生成,JDK 动态代理 / CGLIB |
| 方式 | 说明 |
|---|
| 编程式 | 代码中显式管理,灵活但维护难 |
| 声明式 | 通过注解或 XML 配置,与业务代码分离(推荐) |
| 版本 | 年份 | 主要特性 |
|---|
| Spring 2.5 | 2007 | 注解支持 |
| Spring 3.0 | 2009 | Java5 改进,JEE6 支持 |
| Spring 4.0 | 2013 | 全面支持 Java 8 |
| Spring 5.0 | 2017 | 响应式编程支持 |