0%

Spring

成功的奥秘在于目标的坚定。——迪斯雷利

参考文章:极客学院Spring教程

Spring Bean详细讲解 什么是Bean?

Spring框架是什么

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

Spring框架的好处

可以说是Spring框架的精髓:

  • 轻量,基本版本大约2MB
  • 控制反转(IOC):实现了松散耦合。对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  • 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  • 容器:Spring 包含并管理应用中对象的生命周期和配置。
  • MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
  • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

Spring的两种IOC容器——BeanFactory和ApplicationContext

Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring Beans.

通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XML,Java 注释或 Java 代码来表示。下图是 Spring 如何工作的高级视图。

Spring如何工作的高级视图.png

Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行的系统或应用程序。

Spring提供了两种不同类型的容器:

  • BeanFactory容器,最简单的容器(太简单了,功能实现比较少,不推荐了),给DI提供了基本支持。
  • ApplicationContext容器,该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力。该容器是由 org.springframework.context.ApplicationContext 接口定义。

ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常建议使用 ApplicationContext。BeanFactory 仍然可以用于轻量级的应用程序,如移动设备或基于 applet 的应用程序,其中它的数据量和速度是显著。

Spring的基本模块——BeanFactory(BeanFactory容器)

BeanFactory是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。

Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。

最常用的BeanFactory 实现是XmlBeanFactory 类。即org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用。

需要注意,在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择。否则,一般使用的是 ApplicationContext,除非你有更好的理由选择 BeanFactory。

ApplicationContext是什么?通常的实现是什么?

Application Context 是 spring 中较高级的容器。和 BeanFactory 类似,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。 另外,它增加了企业所需要的功能,比如,从属性文件从解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。

  • FileSystemXmlApplicationContext :此容器从一个XML文件中加载已被定义的bean。在这里,你需要提供给构造器 XML 文件的完整路径
  • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
  • WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。

BeanFactory和ApplicationContext有什么区别?

ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactory,ApplicationContext 会被推荐使用。BeanFactory 仍然可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。

解释对象/关系映射集成模块

Spring 通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事务管理同样支持以上所有ORM框架及JDBC

Spring Bean

Spring Bean是什么

被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建。

一个Spring Bean定义包含什么

bean 定义包含称为配置元数据的信息。

Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。已创建的Bean类需要在Spring配置文件中进行定义,Spring IOC容器才能对Bean进行组配和管理。

一些配置项如下表所示:

bean的一些配置项.png

Spring Bean加载机制

将Bean类添加到Spring IOC容器有三种方式

  • 一种方式是基于XML的配置文件;(现在很不推荐用,太久远了)
  • 一种方式是基于注解的配置(Annotation-based configuration,从Spring2.5开始);
  • 一种方式是基于Java的配置(java-based configuration, 从Spring3.0开始)

Spring Bean的生命周期(重要)

理解 Spring bean 的生命周期很容易。当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。

尽管还有一些在 Bean 实例化和销毁之间发生的活动,但是本章将只讨论两个重要的生命周期回调方法,它们在 bean 的初始化和销毁的时候是必需的。

为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

简而言之,Spring Bean的生命周期可以分为九步:

参考文章:Spring了解Bean的一生(生命周期)

Spring Bean的生命周期 **,这篇文章也包含案例

ApplicationContext Bean的生命周期

ApplicationContextBean的生命周期.png

ApplicationContext容器中,Bean的生命周期流程如上图所示,流程大致如下:

1.首先容器启动后,会对scope为singleton且非懒加载的bean进行实例化,

2.按照Bean定义信息配置信息,注入所有的属性,

3.如果Bean实现了BeanNameAware接口,会回调该接口的setBeanName()方法,传入该Bean的id,此时该Bean就获得了自己在配置文件中的id,

4.如果Bean实现了BeanFactoryAware接口,会回调该接口的setBeanFactory()方法,传入该Bean的BeanFactory,这样该Bean就获得了自己所在的BeanFactory,

5.如果Bean实现了ApplicationContextAware接口,会回调该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext,

6.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessBeforeInitialzation()方法,

7.如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法,

8.如果Bean配置了init-method方法,则会执行init-method配置的方法,

9.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessAfterInitialization()方法,

10.经过流程9之后,就可以正式使用该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存一份该bean的实例,而对于scope为prototype的Bean,每次被调用都会new一个新的对象,期生命周期就交给调用方管理了,不再是Spring容器进行管理了

11.容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法,

12.如果Bean配置了destroy-method方法,则会执行destroy-method配置的方法,至此,整个Bean的生命周期结束

BeanFactory Bean的生命周期

BeanFactory Bean生命周期.png

BeanFactoty容器中, Bean的生命周期如上图所示,与ApplicationContext相比,有如下几点不同:

1.BeanFactory容器中,不会调用ApplicationContextAware接口的setApplicationContext()方法,

2.BeanPostProcessor接口的postProcessBeforeInitialzation()方法和postProcessAfterInitialization()方法不会自动调用,必须自己通过代码手动注册

3.BeanFactory容器启动的时候,不会去实例化所有Bean,包括所有scope为singleton且非懒加载的Bean也是一样,而是在调用的时候去实例化。

哪些是重要的bean生命周期方法? 你能重载它们吗?(setup和teardown)

有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。

bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。

换句话说:为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法(setup),在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法(teardown),只有从容器中移除 bean 之后,才能调用该方法。

Bean的作用域

在IoC容器启动之后,并不会马上就实例化相应的bean,此时容器仅仅拥有所有对象的BeanDefinition(BeanDefinition:是容器依赖某些工具加载的XML配置信息进行解析和分析,并将分析后的信息编组为相应的BeanDefinition)。只有当getBean()调用时才是有可能触发Bean实例化阶段的活动。

当在 Spring 中定义一个 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。

Spring 框架支持以下五个作用域,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。

如下表:

Bean的作用域.png

Spring框架中的单例bean是线程安全的么?

不是,Spring框架中的单例bean不是线程安全的。

Spring Bean小结

项目中的事务处理组件实体类(POJO)可以作为Bean类,Bean类需要在Spring配置文件中进行定义,才能被IOC容器管理和组配。Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。

Spring IOC(也称为依赖注入(DI))

Spring IOC原理

IOC:控制反转也叫依赖注入。利用了工厂模式

将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。

什么是Spring的依赖注入?

依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

拿公司招聘岗位来举例。假设一个公司有产品、研发、测试等岗位。如果是公司根据岗位要求,逐个安排人选,如图中向下的箭头,这是正向流程。如果反过来,不用公司来安排候选人,而是由第三方猎头来匹配岗位和候选人,然后进行推荐,这就是控制反转。

Spring IOC容器是什么?

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

简而言之:“把某些业务对象的的控制权交给一个平台或者框架来统一管理,这个统一管理的平台可以称为IoC容器。”

举个例子:看下面这段代码:

1
2
ApplicationContext appContext = new ClassPathXmlApplicationContext("cjj/models/beans.xml");
Person p = (Person)appContext.getBean("person");

上面代码中,在创建ApplicationContext实例对象过程中会创建一个spring容器,该容器会读取配置文件”cjj/models/beans.xml”,并统一管理由该文件中定义好的所有bean实例对象,如果要获取某个bean实例,使用getBean方法就行了。例如我们只需要将Person提前配置在beans.xml文件中(可以理解为注入),之后我们可以不需使用new Person()的方式创建实例,而是通过容器来获取Person实例,这就相当于将Person的控制权交由spring容器了,差不多这就是控制反转的概念。

Spring IOC的优点?

IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

SpringIOC初始化过程(重要)

详细来说,其实Spring IOC初始化过程就是容器的初始化过程。

之前介绍Spring Bean的时候已经提到了,Spring Bean都是由Spring容器去管理的,而Spring主要有两个容器系列:

  1. 实现BeanFactory接口的简单容器;
  2. 实现ApplicationContext接口的高级容器。

ApplicationContext比较复杂,它不但继承了BeanFactory的大部分属性,还继承其它可扩展接口,扩展的了许多高级的属性,其接口定义如下:

1
2
3
4
5
6
public interface ApplicationContext extends EnvironmentCapable, 
                  ListableBeanFactory, //继承于BeanFactory
                  HierarchicalBeanFactory,//继承于BeanFactory
                  MessageSource, //
                  ApplicationEventPublisher,//
                  ResourcePatternResolver //继承ResourceLoader,用于获取resource对象

在BeanFactory子类中有一个DefaultListableBeanFactory类,它包含了基本Spirng IoC容器所具有的重要功能,开发时不论是使用BeanFactory系列还是ApplicationContext系列来创建容器基本都会使用到DefaultListableBeanFactory类,可以这么说,在spring中实际上把它当成默认的IoC容器来使用。

关于Spirng IoC容器的初始化过程在《Spirng技术内幕:深入解析Spring架构与设计原理》一书中有明确的指出,IoC容器的初始化过程可以分为三步:

  1. Resource定位(Bean的定义文件定位)
  2. 将Resource定位好的资源载入到BeanDefinition
  3. 将BeanDefiniton注册到容器中

如下图:

SpringIOC初始化过程.png

详细内容可以参考这篇博客

Spring IOC详细源码分析推荐这篇文章**

Spring实现IOC的三种方式

属性注入

通过setXXX()方法注入Bean的属性值或者依赖对象,最常用。

  • Spring首先会调用bean的默认构造函数实例化bean对象,然后再通过反射的方法来调用set方法来注入属性值。
  • 属性注入要求bean提供一个默认的构造函数,并且得为需要注入的属性提供set方法

构造函数注入(构造器依赖注入)

使用构造函数注入的前提是:bean必须提供带参的构造函数。

构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

工厂方法注入

注解的方式注入 @Autowired,@Resource,@Required。

@Autowired和@Resource的区别(重要)

简而言之:@Autowired按byType(类型)自动注入,而@Resource则默认按byName(名字)自动注入。

@Autowired是在Spring2.5后引入的,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 可以通过 @Autowired的使用来消除 set ,get方法。

@Resource有两个属性是比较重要的,分别是nametype,Spring 将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。因此,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

Spring AOP

AOP是一个编程目标,”面向切面编程”的目标。实现这个目标,有哪些手段?——其中一个手段是Spring AOP,还有一个手段是AspectJ。Spring在2.5之后借用了AspectJ的语法,借鉴了其编程风格

为什么需要AOP?

AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。

例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

将程序中的交叉业务逻辑(比如安全检查,日志,事务管理、缓存、对象池等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

代理模式

之所以这里单独列出来代理模式,主要因为AOP就是通过代理模式实现的(静态代理、动态代理)

代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。

使用代理好处还不止这些,一个工程如果依赖另一个工程给的接口,但是另一个工程的接口不稳定,经常变更协议,就可以使用一个代理,接口变更时,只需要修改代理,不需要一一修改业务代码。从这个意义上说,所有调外界的接口,我们都可以这么做,不让外界的代码对我们的代码有侵入,这叫防御式编程。代理其他的应用可能还有很多。

上述例子中,类A写死持有B,就是B的静态代理。如果A代理的对象是不确定的,就是动态代理。动态代理目前有两种常见的实现,jdk动态代理和cglib动态代理。

AOP实现原理

AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

实现AOP(不是Spring AOP,而是AOP技术,即Spring AOP和AspectJ)的技术,主要分为两大类:

  • 一是采用动态代理技术(Spring AOP),利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
  • 二是采用静态织入(静态代理)的方式(AspectJ),引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码.

https://www.jianshu.com/p/fe8d1e8bd63e

https://www.cnblogs.com/puyangsky/p/6218925.html

https://juejin.im/post/5a55af9e518825734d14813f

JDK和CGLib动态代理性能对比

关于两者之间的性能的话,JDK动态代理所创建的代理对象,在以前的JDK版本中,性能并不是很高,虽然在高版本中JDK动态代理对象的性能得到了很大的提升,但是他也并不是适用于所有的场景。主要体现在如下的两个指标中:

1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;

2、但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;

3、因此,对于singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则比较适用JDK动态代理。

Spring AOP中的JDK和CGLib动态代理哪个效率更高?

Java两种动态代理JDK动态代理和CGLIB动态代理

Spring事务

这是Spring针对JDBC来设计的,事务和数据库的事务定义相同。

关于事务,老生常谈的就是ACID,然后三种事务并发可能的问题:脏读、不可重复读、幻读。针对这三种问题,设计了四种解决的隔离级别:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

Spring 事务中的隔离级别

而Spring的事务隔离级别就是根据上面四种隔离级别而设置的。加上”默认”的级别,一共有五种级别。具体说,TransactionDefinition 接口中定义了五个表示隔离级别的常量:

  • TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.

    • TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 低的隔离级别,允许读取尚未提交的数据变 更,可能会导致脏读、幻读或不可重复读
  • TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏 读,但是幻读或不可重复读仍有可能发生

  • TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据 是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  • TransactionDefinition.ISOLATION_SERIALIZABLE: 高的隔离级别,完全服从ACID的隔离级别。所有的事 务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻 读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

Spring事务中的事务传播行为

支持当前事务的情况

  • TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事 务,则创建一个新的事务。

  • TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事 务,则以非事务的方式继续运行。

  • TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有 事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况:

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当 前事务挂起。

  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把 当前事务挂起。

  • TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:

  • TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套 事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

Spring MVC

Spring Boot

有关Spring可能的问题:

SpringBoot知识系统.png

最常问的问题之一:SpringBoot的启动流程?

Spring Boot启动流程

  1. 配置Environment
  2. 准备Context上下文,包括执行 ApplicationContext 的后置处理、初始化 Initializer、通知Listener 处理 ContextPrepared 和 ContextLoaded 事件。
  3. 执行 refreshContext,也就是前面介绍过的 AbstractApplicationContext 类的 refresh 方法。

在SpringBoot中有两种上下文,一种是bootstrap,另外一种是application:

  • bootstrap是应用程序的父上下文,会先于applicaton加载。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。
  • bootstrap 里面的属性会优先加载,默认也不能被本地相同配置覆盖。

Spring Boot注解

  • Starter是SpringBoot提供的无缝集成功能的一种方式,使用某个功能时开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由SpringBoot自动配置进行Bean的创建。例如需要使用 Web 功能时,只需要在依赖中引入 Spring-boot-starter-web 即可。

  • Actuator 是用来对应用程序进行监视和管理,通过 RESTful API 请求来监管、审计、收集应用的运行情况。

  • DevTools 提供了一系列开发工具的支持,来提高开发效率。例如热部署能力等。

  • CLI 就是命令行接口,是一个命令行工具,支持使用 Groovy 脚本,可以快速搭建 Spring 原型项目。