今天我们来说一下Spring和SpringBoot的区别,很多小伙伴其实都分不清楚的,这个虽然对技术上没什么提升,但是万一面试问到总还是有点用的。
Spring和SpringBoot的区别
从历史来看的话肯定是先有Spring再有SpringBoot的,他们的地位是不同的,Spring其实应该叫SpringFramework,也就是框架的意思。而SpringBoot主包觉得更像是一键启动的意思。
这个是Spring中文网对SpringSpring Framework 中文文档的介绍,可以看到我们前几篇说的内容基本上都是Spring的和SpringBoot基本上没什么关系,而下面是SpringBoot的介绍页面,好像也有Spring的内容但好像大部分都是组件,这里就是Spring和SpringBoot的区别所在。
配置方式 | 需手动配置 XML 或 JavaConfig | 自动配置(@EnableAutoConfiguration) |
依赖管理 | 需手动管理依赖版本 | 通过 starter 自动管理依赖(如 spring-boot-starter-web) |
内嵌服务器 | 需手动部署到 Tomcat/Jetty | 默认内嵌 Tomcat/Jetty(无需额外部署) |
项目启动 | 需配置 web.xml 和 DispatcherServlet | 只需 main() 方法 + @SpringBootApplication |
监控与管理 | 需集成 Spring Actuator | 内置 Actuator(提供健康检查、指标监控等) |
打包部署 | 需打包为 WAR 并部署到外部服务器 | 可打包为独立 JAR(包含所有依赖) |
适用场景 | 需要高度定制化的复杂企业应用 | 快速开发微服务、REST API 或单体应用 |
从这个表格可以知道SpringBoot其实是Spring的增强版本,没有Spring作为基础就没有现在的SpringBoot,SpringBoot其实就是整合组件的缝合怪,把Spring和各大优秀的中间件聚拢再一起形成一个项目,我们常说的自动装配、自动配置就是SpringBoot的核心功能。
SpringBoot相对于Spring会加载yml文件以及扫描@Configuration注解自动的读取配置文件为我们配置好类,不需要再去xml中定义了,还有就是Spring的项目是需要编写web.xml的也就是需要搭配使用Tomcat服务器,而我们SpringBoot内置了Tomcat服务器,只需要一个@SpringBootApplication注解就可以直接启动我们的项目。
这就是为什么SpringBoot这么火爆的原因,我们只需要把自己要使用的组件加入进来就可以快速的完成一个小型项目,大大的降低了开发的门槛,减少了大量的配置文件编写,让各个组件可以更加容易的搭配使用。这就是为什么SpringBoot由称为脚手架的原因。
声明式事务
这一期的内容不够了,拿这个来水一下吧。事务是数据库操作的最小逻辑单元,它作为一个不可分割的工作序列,要么全部执行成功,要么全部回滚(就像从未执行过)。确保数据从一种一致状态转变为另一种一致状态。代码这个是事务的四大特性也叫(ACID)。
原子性 (Atomicity) | 事务中的操作要么全部成功,要么全部失败(没有中间状态)。 | 转账操作:A 扣款和 B 入款必须同时成功或失败。 |
一致性 (Consistency) | 事务执行前后,数据库的完整性约束不被破坏(如外键、唯一性约束)。 | 转账后,A + B 的总金额不变。 |
隔离性 (Isolation) | 并发事务之间互不干扰,防止数据混乱(通过锁或 MVCC 实现)。 | 事务 A 读取时,事务 B 不能修改未提交的数据。 |
持久性 (Durability) | 事务一旦提交,结果永久保存(即使系统崩溃)。 | 转账成功后,数据必须写入磁盘。 |
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// 业务代码(如扣款、入款)
accountDao.debit(fromAccount, amount);
accountDao.credit(toAccount, amount);
transactionManager.commit(status); // 提交
} catch (Exception e) {
transactionManager.rollback(status); // 回滚
throw e;
}
}
这个是我们的手动事务,一般情况下还会搭配分布式锁或者Redis锁来一起使用的,也就是业务出现问题后被catch捕捉进行补充操作也就是回滚,而声明式事务也就是使用注解的形式,是不是很简单,那他又是怎么实现的呢?没错就是基于AOP切面编程实现的,就如上一篇说的再Spring上下文刷新阶段也就是Bean的创建阶段,会扫描是否有注解,如果有就会生成动态代理的实现类对象,然后被对应的处理Bean捕捉回调invoke方法。不明白的小伙伴回看主包的前几篇吧。
@Transactional(rollbackFor = Exception.class) // 声明事务
REQUIRED(默认) | 如果当前没有事务,则新建一个;如果已存在事务,则加入其中。 |
REQUIRES_NEW | 总是新建事务,如果当前有事务,则挂起当前事务。 |
SUPPORTS | 如果当前有事务,则加入;如果没有,则以非事务方式运行。 |
NOT_SUPPORTED | 以非事务方式运行,如果当前有事务,则挂起。 |
MANDATORY | 必须在事务中运行,否则抛出异常。 |
NEVER | 必须在非事务中运行,否则抛出异常。 |
NESTED | 如果当前有事务,则嵌套执行(子事务回滚不影响父事务;父事务回滚会导致子事务回滚)。 |
这个是事务的传播行为通过 @Transactional(propagation = …) 配置),好了分布式事务就不说了,具体事务有关的等主包的数据库系列吧。
总结
本篇主要说名了Spring和SpringBoot之前的区别,水了一下加了声明式事务,下期主包暂时还不知道讲什么好,就这下期见。
评论前必须登录!
注册