Spring Boot 中starter的原理详析

关于“Spring Boot 中starter的原理详析”,我会给出以下完整攻略:

一、什么是 Starter

Spring Boot 中的起步依赖 Starter 是一个 Maven 项目,是一种便于其他 Spring Boot 项目使用的“快捷方式”。Starter 可以包括许多常用的库和依赖,例如 Spring Boot Web Starter,它包括了 Spring Boot Web 依赖,以及其他必要的库和依赖,让开发者能够更快捷地开发 Spring Boot Web 应用程序。

二、什么是自动配置

Spring Boot 自动配置是一种便捷方式,使得 Spring 应用程序可以不需要多余的 XML 配置文件或代码即可快速构建。Spring Boot 通过启动自动配置功能,根据当前项目中添加的依赖项进行一系列配置,可以让开发者专注于代码编写而不需要关注配置问题。

## 三、Starter 原理详解

Spring Boot 中通过读取 META-INF/spring.factories 文件中的内容,来动态导入配置类和启动类。Starter 也是这种方式导入的,只需在该文件中定义即可。

以 Spring Boot Web Starter 依赖库为例,它包括了 Spring Boot Web 依赖,以及其他必要的库和依赖。使用该 Starter 的开发者,只需要在自己的 Maven 项目中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot 在启动时,会扫描项目中的 Starter,自动导入相关的依赖项,并完成相应的配置。这个过程中会使用到 Spring Boot 自带的自动配置类,如果需要自定义配置,则可以在自己的应用程序中编写相关的配置类。

Spring Boot 中的 Starter 可以有多个,每个 Starter 都会有一个或多个自动配置类。例如,spring-boot-starter-data-jpa 依赖包括了 Spring Data JPA 和 Hibernate 的依赖,并定义了多个自动配置类,如下:

  1. DataSourceAutoConfiguration:自动配置 DataSource
  2. HibernateJpaAutoConfiguration:自动配置 Hibernate
  3. JdbcTemplateAutoConfiguration:自动配置 JDBC 模板
  4. TransactionAutoConfiguration:自动配置事务管理器

如果不需要某种自动配置项,则可以使用 Spring Boot 的 @EnableAutoConfiguration 注释来忽略它们。

四、Starter 示例说明

示例1:创建自定义 Starter

我们可以创建一个自定义的 Starter,并在自己的项目中使用它。操作步骤:

  1. 创建 Maven 项目,并命名为 my-starter。
  2. 在项目的 pom.xml 文件中添加如下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>${spring.boot.version}</version>
</dependency>

该 Starter 将会包含 Spring Boot 的常用依赖。
3. 在 src/main/resources/META-INF 目录下创建 spring.factories 文件,并添加如下配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration

定义了自动配置类 MyAutoConfiguration。
4. 在 src/main/java/com/example/demo/ 目录下创建 MyAutoConfiguration.java 文件,并添加如下代码:

@Configuration
public class MyAutoConfiguration {

    @Bean
    public HelloService helloService() {
        return new HelloService();
    }

}

定义了一个 HelloService 的 Bean。
5. 在项目根目录下使用以下命令进行打包:

mvn clean package

即可在 target 目录下找到生成的 my-starter-1.0-SNAPSHOT.jar 文件。
6. 在其他 Spring Boot 项目中,可以通过添加以下依赖来使用该 Starter:

<dependency>
    <groupId>com.example.demo</groupId>
    <artifactId>my-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  1. 在应用程序中,即可使用 MyAutoConfiguration 中定义的 Bean:
@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @RequestMapping("/")
    public String hello() {
        return helloService.sayHello();
    }
}

请求根路径,输出 hello world。可以在 MyAutoConfiguration 中定义更多的 Bean,让其他 Spring Boot 项目可以快速使用。

示例2:修改 Starter 自动配置项

对于一个 Spring Boot Starter,我们可以自定义某些自动配置项,并让其他使用该 Starter 的 Spring Boot 项目使用我们的自定义配置项。操作步骤:

  1. 在我们的 Starter 中添加自定义的自动配置项。
    比如,我们添加一个 CaffeineCacheManager 的自动配置类,用于配置缓存管理器:
@Configuration
@ConditionalOnClass(Caffeine.class)
@EnableConfigurationProperties(CaffeineCacheProperties.class)
@AutoConfigureAfter(CacheAutoConfiguration.class)
public class CaffeineCacheAutoConfiguration {

    private final CaffeineCacheProperties properties;

    public CaffeineCacheAutoConfiguration(CaffeineCacheProperties properties) {
        this.properties = properties;
    }

    @Bean
    @Primary
    public CaffeineCacheManager caffeineCacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    private Caffeine caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .initialCapacity(properties.getInitialCapacity())
                .maximumSize(properties.getMaximumSize())
                .expireAfterWrite(properties.getExpireAfterWrite().toNanos(), TimeUnit.NANOSECONDS);
    }
}

其中,@ConditionalOnClass 注解表示只有当类路径上存在 Caffeine 类时才会进行自动配置。@EnableConfigurationProperties 注解将 CaffeineCacheProperties 类注册为一个 Bean,可以通过它来访问配置文件中的属性。@AutoConfigureAfter 注解表示该自动配置类在 CacheAutoConfiguration 之后执行。

  1. 在 Spring Boot 项目中,添加如下自定义配置项:
spring.cache.type=caffeine
spring.cache.caffeine.spec=initialCapacity=100,maximumSize=1000,expireAfterWrite=100ms

其中,spring.cache.type 表示使用 CaffeineCacheManager 作为缓存管理器,spring.cache.caffeine.spec 表示使用以下属性来配置 CaffeineCacheManager。

  1. 运行该 Spring Boot 项目,就会使用我们自定义的 CaffeineCacheManager 缓存管理器。

通过这样的方式,我们可以对 Spring Boot Starter 进行自定义配置项的添加,并让其他 Spring Boot 项目可以方便地使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 中starter的原理详析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue常用的几个指令附完整案例

    下面是讲解Vue常用的几个指令的攻略: 一、v-bind指令 v-bind指令可以动态绑定HTML元素的属性,例如动态指定元素的class、style、src等。其语法格式为v-bind:属性名=”属性值”,或者简写为:属性名=”属性值”。 示例一: 假设我们有一个用户名字的数据变量,需要将它实时地绑定到HTML元素的title属性里面,可以这样使用v-bi…

    Vue 2023年5月28日
    00
  • vue 表单输入框不支持focus及blur事件的解决方案

    这里是一份解决 vue 表单输入框不支持 focus 及 blur 事件的完整攻略。 问题背景 在 vue 中,我们通常使用 v-model 来绑定表单输入框的数据双向绑定。而对于 focus 和 blur 事件,由于 v-model 的实现机制,focus 和 blur 事件是无法触发的,这就导致了一些问题,比如我们不能直接在表单输入框获取焦点和失去焦点时…

    Vue 2023年5月28日
    00
  • Ant Design封装年份选择组件的方法

    Ant Design是一个流行的UI组件库,它提供了多个常用的组件,但是在特定的业务场景下,我们可能需要定制一些自己的组件,如年份选择组件。在本文中,我们将探讨如何使用Ant Design封装年份选择组件。 第一步:安装Ant Design npm install antd 安装完成后,我们需要在项目中引入Ant Design: import { DateP…

    Vue 2023年5月29日
    00
  • Vue导入excel文件的两种方式(form表单和el-upload)

    如果要在Vue中实现导入Excel文件的功能,通常有两种方式:通过form表单提交和使用el-upload组件。下面对这两种方式进行详细介绍。 使用form表单提交 使用form表单提交的方式相对简单,需要在页面中添加一个input元素,并且指定type为“file”。在用户进行选择文件上传操作时,会触发input元素的change事件回调函数,然后在回调函…

    Vue 2023年5月28日
    00
  • Vue组件和Route的生命周期实例详解

    Vue组件和Route的生命周期是Vue.js框架中非常重要的概念。在Vue.js开发中,生命周期指 Vue实例从创建到销毁的整个过程, Vue实例在这个过程中会自动执行一些方法,这些方法被称为生命周期钩子函数,这些函数可以帮助我们在不同的阶段进行操作。 在Vue Router中,我们经常需要用到Route的生命周期。Route的生命周期指的是当一个路由被匹…

    Vue 2023年5月27日
    00
  • vue.js语法及常用指令

    下面是关于“vue.js语法及常用指令”的完整攻略。 一、Vue.js语法 Vue.js 是一款流行的 JavaScript 框架,它的语法和模板采用了基于 HTML 的模板语法,简化了前端开发中数据绑定和 DOM 操作的复杂度。下面是 Vue.js 的一些基本语法: 1. 基本模板 Vue.js 的基本模板由普通的 HTML 标签和 Vue.js 的特殊属…

    Vue 2023年5月27日
    00
  • 解决Element-ui radio单选框label布尔/数值的一个坑

    针对“解决Element-ui radio单选框label布尔/数值的一个坑”这个问题,我准备整理出一份完整的攻略,供大家参考。 问题描述 在使用 Element-UI 的 radio(单选框)组件时,可能会遇到一个问题,即在 label 属性中使用了布尔值或数值类型时,无法正常选中你所想要的选项,需要进行额外的处理。 解决方案 问题的解决方案是在 el-r…

    Vue 2023年5月28日
    00
  • Vue 中 createElement 使用实例详解

    下面我给出“Vue 中createElement 使用实例详解”的完整攻略,包括基本语法和两条示例说明。 What is createElement? createElement 是 Vue 的一个渲染函数,它通过 JavaScript 代码的方式生成虚拟 DOM。通过 createElement 我们能够在 JS 代码中定义 Vue 的组件,从而实现动态渲…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部