Spring 为开发 Java 应用程序提供了全面的基础架构支持,它将 Java 对象交由容器统一管理,从而实现控制反转(IOC)和依赖注入(DI),并提供了一些常用模块如 SpringAOP、SpringJDBC、SpringMVC 等等
SpringBoot 继承了 Spring 的核心思想,并进一步简化应用开发
Spring 和 SpringBoot 的区别主要有以下:
使用 Spring 开发,为了使用某个第三方组件,有时候需要引入好几个 Maven 依赖,SpringBoot 把第三方组件需要的依赖整合成一个 starter 方便引入
例如,使用 SpringBoot 创建 Web 应用只需要引入如下 starter
该 starter 包含的依赖项如下图
spring-boot-starter-web 预先打包了这些依赖项,开发者无需担心这些依赖项和它们的兼容版本
Spring 的配置项是一大问题,当引入第三方依赖需要提供相关的 XML 配置文件,降低编程效率。SpringBoot 实现了自动装配,过去,如果我们引入第三方依赖,需要手动配置,非常麻烦,而在 SpringBoot 只需要引入一个 starter,SpringBoot 会自动扫描并配置所需要的 Bean,开发者通过少量注解和一些简单的配置就能使用第三方组件了
主要用于开启自动配置,它也是一个组合注解,主要组合了 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
该注解组合了 @Import 注解,@Import 注解导入了 EnableAutoCofigurationImportSelector 类,它使用 SpringFactoriesLoader.loaderFactoryNames 方法把 spring-boot-autoconfigure.jar/META-INF/spring.factories 中的每一个 xxxAutoConfiguration 文件都加载到 IOC 容器,实现自动配置
@SpringBootConfiguration 注解继承自 @Configuration,二者功能基本一致,标注当前类是配置类
自动扫描并加载符合条件的组件,如 @Component、@Controller、@Service、@Repository 等或者 bean 定义,最终将这些 Bean 加载到 IOC 容器
在 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 实现条件装配,它根据特定的条件(如某个类的存在、某个 Bean 的创建)决定是否创建特定的 Bean
@Conditional 注解在 SpringBoot 的自动配置中起着关键作用,通过条件注解控制某一个配置是否生效,避免一次性加载所有配置,减少内存消耗
@Profile 注解的作用是指定的 Bean 在特定的 Profile 环境生效,任何 @Component 或 @Configuration 注解的类都可以使用 @Profile 注解,@Profile 需要约定生效的环境
@Configuration
@Profile("prod")
public class DataConfig {
...
}
运行时使用哪个 profile 由 spring.profiles.active 控制
spring.profiles.active=prod
在 SpringBoot 中,当我们引入 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 依赖时,会默认注入 DataSourceTransactionManager 或 JpaTransactionManager
SpringBoot 提供了声明式事务管理,可以通过 @Transactional 注解声明一个方法是一个事务,如果注解在类上,则整个类的所有方法都支持事务,可以通过 value 属性指定配置的事务管理器名: @Transactional(value="transactionManagerPrimary")
所谓事务的传播行为是指,如果在当前事务开始前,一个事务上下文已经存在,此时有若干选项可以指定当前事务的执行行为,可以通过 @Transactional 的 propagation 属性指定事务的传播行为: @Transactional(propagation=Propagation.NOT_SUPPORTED)
隔离级别是指若干个并发的事务之间的隔离程度,可以通过 @Transactional 的 isolation 属性指定事务的隔离级别: @Transactional(isolation = Isolation.READ_COMMITTED)