Spring 核心就是帮你把对象创建、依赖管理、事务、配置、切面这些重复样板代码收起来,不用自己写大量 new、工厂、工具类、try-catch 事务、JDBC 模板代码。下面分点讲清楚:
1. IoC / 控制反转 + DI 依赖注入(最核心)
传统写法:自己 new 对象()、手动维护依赖,硬编码,耦合高,改一处牵连很多。
// 传统
UserService service = new UserService();
service.setUserDao(new UserDao());
Spring IoC:容器负责创建、管理对象(Bean),依赖自动注入。
注解
@Component / @Service / @Repository / @Autowired不需要手动
new,对象生命周期交给容器解耦:业务代码只面向接口,不关心实例怎么造
方便替换实现、单元测试(容易 Mock)
一句话:不用自己组装对象,Spring 帮你装配。
2. AOP 面向切面编程,抽离通用横切逻辑
很多逻辑是散落在各个方法里的重复代码:日志、权限校验、性能埋点、异常统一捕获、限流。 传统:每个方法开头结尾复制粘贴日志代码。 Spring AOP:把这类横切逻辑抽成切面,不侵入业务代码。
@Aspect、@Before/@After/@Around典型场景:接口日志、统一异常处理、事务(@Transactional 底层依赖 AOP) 业务代码只写业务,日志、监控单独维护。
3. 声明式事务 @Transactional
原生 JDBC / MyBatis 写事务非常繁琐: 手动 Connection、setAutoCommit(false)、try 提交、catch 回滚、finally 关闭连接,容易漏写回滚。
Spring 声明式事务: 只需要在方法上加 @Transactional,一行注解搞定事务。
异常自动回滚
支持传播行为、隔离级别、只读事务配置 底层 AOP 自动包裹事务逻辑,消除大量事务样板代码。
4. 模板化封装(JdbcTemplate、RestTemplate 等)
原生 JDBC 样板:加载驱动、获取连接、创建 Statement、处理 ResultSet、关闭资源(连接、statement、rs),每个查询都写一遍,还容易忘关闭连接造成泄漏。
Spring 提供各种 XXXTemplate:
JdbcTemplate:一行执行 SQL、自动关闭资源,不用写关闭代码RedisTemplate、RestTemplate、JmsTemplate统一封装资源获取、异常处理、资源释放,只需要关心 SQL / 参数,不用写资源管理。
5. 统一的异常体系
Spring 把底层各种异构异常(JDBC、Hibernate、MyBatis)包装成一套统一的 DataAccessException 体系,不再需要捕获一堆底层驱动专属异常,上层业务捕获更简单。
6. 整合生态,兼容主流框架
Spring 不是要替代 MyBatis、Redis、Quartz,而是做粘合剂: Spring 可以很方便整合 MyBatis、Hibernate、RabbitMQ、Redis、定时任务等。 不需要自己写适配层、连接池管理,官方 / 社区 Starter 直接集成。
到 SpringBoot 阶段进一步进化,但底层能力来自 Spring Core。
7. 非侵入式、低耦合
大部分功能靠注解、配置,不需要业务类继承 Spring 特定类、实现特定接口(对比早期 EJB,必须实现接口、很重)。 业务 POJO 就是普通 Java 对象(POJO),可独立测试,脱离 Spring 容器也能跑。
8. 灵活的配置体系
XML 配置(老方式)
注解配置
@Configuration + @Bean条件装配
@Conditional,按需加载 Bean 可以根据环境、类是否存在动态创建组件,方便多环境切换、可选组件。
简单对比总结
补充:SpringBoot 是 Spring 的增强
SpringBoot 基于 Spring,再加上自动配置、starter、内嵌容器,进一步简化:不用写 XML、不用配 Tomcat、自动装配 Bean;但底层简化开发的基础能力,全部来自 Spring Framework 的 IoC/AOP/ 事务 / 模板。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢