1. 什么是SpringBoot?
SpringBoot 是Spring开源项目下的子项目,是Spring组件一站式解决方案,它简化了构建Spring项目的难度,提供了各种注释简化了繁重的配置(之前的Spring项目中都采用大量XML配置文件),并且提供了各种启动器(Starter),使开发者更容易上手,更容易创建项目。
2. SpringBoot的优点?
a. 容易上手,提升开发效率 (比如创建一个bean,只需要注释对应的class对象或者对应的方法,无需创建繁重的xml配置), 架构上的设计也变得跟清楚简单(不如需要引入jpa依赖,那么只需要加入jpa starter的依赖就可以了)
b. 相比传统的SpringMVC架构项目,各方面都变得更加简单, 使得编码,配置,部署,监控等都变得简单
c. 功能齐全(Spring全家桶), 比如jpa, mybatis,security,kafka, redis等都有对应的starter可以直接依赖使用
3. SpringBoot的关键/常用注释有哪些?
@SpringBootApplication, @SpringBootConfiguration, @Configuaration, @EnableAutoConfiguration, @Bean, @Service, @Component, @Autowaire, @Resource, @Respository, @Transctional等
4. SpringBoot的Starter的工作原理是什么?在项目中用过的starter有哪些?
在SpringBoot启动是,@SpringBootApplication会自动去maven中读取每个starter的spring.factories文件,这个文件中定义了所有需要的Bean,这个Bean会自动装配并且被注入到SpringContext中
5. SpringBoot的事务,请解释一下怎么用?
编程式事务
声明式 - @Transactional (推荐使用)
6. SpringBoot的事务,哪些情况下会失效?为什么?
1. 方法名是非public修饰的
@Transactional(rollbackOn = Exception.class)
protected void method_b() {
// business logic code...
}
Why: 因为Spring AOP是通过反射+动态代理实现的,如果是其他如protected/private修饰的话是没办法用动态代理的
2. 事务方法被同类其他方法直接调用
public class TransactionalService {
public void method_a() {
method_a();
}
@Transactional(rollbackOn = Exception.class)
public void method_b() {
// business logic code...
}
}
Why: 被本地方法直接调用走的不是Spring AOP动态代理,所以没生效
3. 抛出的异常不在捕捉范围内
Why: 就是这样定义的,没问什么, 哈哈哈
等等比如因隔离机制和传播机制的不同定义方式造成的失效问题 (待研究)