1.Springboot自动装配过程
1.通过注解
@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})
2.AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
3.通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
4.依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
2.已经有了Spring为什么还要设计SpringBoot?
Spring 通常指的是 Spring framework 。通常 Java 开发就是面向对象开发、面向抽象接口开发。而软件项目大多都是“堆积木”,随着版本迭代会越来越大,这造成了个很大的问题就是对象的管理。刚好 Spring 的控制反转,依赖注入,切面编程的特性对这些类生命周期的管理,组件模块化,基础层和业务分离解耦提供了很大的便利。就像粘合剂一样把各种功能的库“粘”到一起,让它们协同工作。
除了上图中的一些功能特性外,Spring framework 另外有个很少被提及的特点,它很少去造轮子,它只作上层的适配,作为一个中间抽象层。这种好处在于灵活,使用者可以根据场景切换技术栈;另外这成就了 Spring framework 成为事实上 J2EE 的标准。 Spring framework 已经成为 Java 开发必须掌握的基本框架,很多时候我们开发就是跟它打交道。
Spring framework 经过数年的迭代已经丧失了轻量级的标签。在享受 Spring framework 带来的便利的同时,我们又进入了另一个噩梦:大量的 XML 配置。 Spring 使用者不单单要写业务代码,还要通过编写对应的 XML 配置,引入其它组件或者功能类库也要进行繁琐的适配,这偏离了 Spring framework 最初设计的初衷。所以 Spring Boot 被设计出来。
Spring Boot 将 Spring framework 的功能进行了扩展,将繁琐的配置功能进行了内部整合,通过一些自动化的配置和类似 SPI 的发现机制来自动感知功能组件,大大降低了使用成本,而且保证了和Spring framework 的一致性。
SpringBoot优点:
简便
Spring Boot可以快速通过引导式的步骤搭建一个生产级企业应用开发平台,而无需繁琐的配置。而且提供了默认配置,甚至你可以达到零配置接入。
灵活
Spring Boot同时对常用的功能进行了组件化的抽象,可以按需引用。另外也指定了一揽子的组件规范让开发者可以自行实现符合 Spring Boot 风格的组件(Starter),让你实现插件化开发。
集中
每一个版本的依赖都经过测试和挑选,对各个组件进行了集中管理,构成一个 parent 集合,减少了依赖冲突的可能性。
敏捷
Spring Boot通过一些注解简化了之前的开发和配置,减少了模板代码的编写,加快了开发速度。内置Web 容器甚至可以以 Jar 的方式快速部署运行。
两者之间的关系
Spring framework 和 Spring Boot 的根本是一致的。Spring Boot 是 Spring framework 的引导程序以简化其配置和使用。而Spring framework 是 Spring Boot 的基础,Spring Boot 无法脱离 Spring framework 。用户通过上层 Spring Boot 的引导来使用 Spring framework 。
3.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下
3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
4.Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
5.Spring Boot 中如何实现定时任务 ?
定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled[ˈskedʒuːld] 注解,另一个则是使用第三方框架 Quartz。