SpringBoot 学习笔记

x33g5p2x  于2个月前 转载在 Spring  
字(3.2k)|赞(0)|评价(0)|浏览(105)

Spring 与 SpringBoot 的区别?

Spring 为开发 Java 应用程序提供了全面的基础架构支持,它将 Java 对象交由容器统一管理,从而实现控制反转(IOC)和依赖注入(DI),并提供了一些常用模块如 SpringAOP、SpringJDBC、SpringMVC 等等

SpringBoot 继承了 Spring 的核心思想,并进一步简化应用开发

Spring 和 SpringBoot 的区别主要有以下:

1. 简化依赖

使用 Spring 开发,为了使用某个第三方组件,有时候需要引入好几个 Maven 依赖,SpringBoot 把第三方组件需要的依赖整合成一个 starter 方便引入

例如,使用 SpringBoot 创建 Web 应用只需要引入如下 starter

该 starter 包含的依赖项如下图

spring-boot-starter-web 预先打包了这些依赖项,开发者无需担心这些依赖项和它们的兼容版本

2.自动装配

Spring 的配置项是一大问题,当引入第三方依赖需要提供相关的 XML 配置文件,降低编程效率。SpringBoot 实现了自动装配,过去,如果我们引入第三方依赖,需要手动配置,非常麻烦,而在 SpringBoot 只需要引入一个 starter,SpringBoot 会自动扫描并配置所需要的 Bean,开发者通过少量注解和一些简单的配置就能使用第三方组件了

SpringBoot 的核心注解有哪些?

1. @SpringBootApplication

主要用于开启自动配置,它也是一个组合注解,主要组合了 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

2. @EnableAutoConfiguration

该注解组合了 @Import 注解,@Import 注解导入了 EnableAutoCofigurationImportSelector 类,它使用 SpringFactoriesLoader.loaderFactoryNames 方法把 spring-boot-autoconfigure.jar/META-INF/spring.factories 中的每一个 xxxAutoConfiguration 文件都加载到 IOC 容器,实现自动配置

3. @SpringBootConfiguration

@SpringBootConfiguration 注解继承自 @Configuration,二者功能基本一致,标注当前类是配置类

4. @ComponentScan

自动扫描并加载符合条件的组件,如 @Component、@Controller、@Service、@Repository 等或者 bean 定义,最终将这些 Bean 加载到 IOC 容器

SpringBoot 自动配置的原理

在 spring 程序 main 方法中添加 @SpringBootApplication 或者 @EnableAutoConfiguration,@EnableAutoConfiguration 用于开启自动装配功能,该注解又包含 @AutoConfigurationPackage 和 @Import 注解

@AutoConfigurationPackage 指定了默认的包规则,就是将主程序类所在包及子包下的组件扫描到 Spring 容器中

@Import 注解导入了 EnableAutoCofigurationImportSelector 类,它使用 SpringFactoriesLoader.loaderFactoryNames 方法把 spring-boot-autoconfigure.jar/META-INF/spring.factories 中的每一个 xxxAutoConfiguration 文件都加载到 IOC 容器

总结:开启自动装配后,SpringBoot 会自动去 maven 中读取每个 starter 中的 spring.factories 文件,该文件里配置了需要被加载到 spring 容器的 bean,实现自动配置

SpringBoot @Conditional 注解

SpringBoot 使用条件注解 @Conditional 实现条件装配,它根据特定的条件(如某个类的存在、某个 Bean 的创建)决定是否创建特定的 Bean

@Conditional 注解在 SpringBoot 的自动配置中起着关键作用,通过条件注解控制某一个配置是否生效,避免一次性加载所有配置,减少内存消耗

SpringBoot @Profile 注解

@Profile 注解的作用是指定的 Bean 在特定的 Profile 环境生效,任何 @Component 或 @Configuration 注解的类都可以使用 @Profile 注解,@Profile 需要约定生效的环境

@Configuration
@Profile("prod")
public class DataConfig {

  ...
}

运行时使用哪个 profile 由 spring.profiles.active 控制

spring.profiles.active=prod

SpringBoot 中的事务管理

在 SpringBoot 中,当我们引入 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 依赖时,会默认注入 DataSourceTransactionManager 或 JpaTransactionManager

SpringBoot 提供了声明式事务管理,可以通过 @Transactional 注解声明一个方法是一个事务,如果注解在类上,则整个类的所有方法都支持事务,可以通过 value 属性指定配置的事务管理器名: @Transactional(value="transactionManagerPrimary")

SpringBoot 中事务的传播行为

所谓事务的传播行为是指,如果在当前事务开始前,一个事务上下文已经存在,此时有若干选项可以指定当前事务的执行行为,可以通过 @Transactional 的 propagation 属性指定事务的传播行为: @Transactional(propagation=Propagation.NOT_SUPPORTED)

  • REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
  • SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
  • MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
  • REQUIRES_NEW:如果当前存在事务,则把当前事务挂起;如果当前没有事务,创建一个新的事务
  • NOT_SUPPORTED:如果当前存在事务,则把当前事务挂起;如果当前没有事务,以非事务方式运行
  • NEVER:如果当前存在事务,则抛出异常;如果当前没有事务,以非事务方式运行

SpringBoot 中事务的隔离级别

隔离级别是指若干个并发的事务之间的隔离程度,可以通过 @Transactional 的 isolation 属性指定事务的隔离级别: @Transactional(isolation = Isolation.READ_COMMITTED)

  • DEFAULT:默认值,表示使用底层数据库的默认隔离级别
  • READ_UNCOMMITTED:表示一个事务可以读取另一个事务修改但还没有提交的数据,该级别不能防止脏读和不可重复读
  • READ_COMMITTED:表示一个事务只能读取另一个事务已经提交的数据,该级别可以防止脏读,不能防止不可重复读
  • REPEATABLE_READ:表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同,该级别可以防止脏读和不可重复读,但不能防止幻读
  • SERIALIZABLE:所有的事务串行化执行,该级别可以防止脏读、不可重复读以及幻读,但将严重影响程序的性能

相关文章