Spring Boot 中starter的原理详析

yizhihongxing

关于“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日

相关文章

  • 如何使用 Vuex的入门教程

    下面我将给出“如何使用 Vuex的入门教程”的详细攻略: 1. Vuex是什么 Vuex是一个专为Vue.js应用程序开发的状态管理模式(store)+库,它采用集中式存储管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。 2. 如何安装并使用Vuex (1)在Vue项目中安装Vuex: 在项目目录下打开终端,执行以下命令: npm …

    Vue 2023年5月27日
    00
  • element ui的el-input-number修改数值失效的问题及解决

    针对“element-ui的el-input-number修改数值失效的问题及解决”这个问题,我可以给出如下的完整攻略。攻略中包含了问题出现的原因、解决方法、示例说明等内容。 问题背景 在使用 element-ui 的 el-input-number 组件时,我们可能会遇到一个问题:在表单中使用该组件后,我们无法通过键盘输入数字来修改数值,只能通过上下箭头或…

    Vue 2023年5月28日
    00
  • vue2自定义组件通过rollup配置发布到npm的详细步骤

    下面是详细的“vue2自定义组件通过rollup配置发布到npm的详细步骤”。 准备工作 在开发vue2自定义组件前,需要准备好以下环境: Node.js Vue.js Rollup.js 打包工具(如Babel等) NPM 步骤 1. 创建项目 首先,需要创建一个npm包项目。使用npm init命令初始化项目,按照提示填写项目基本信息。然后,在项目中安装…

    Vue 2023年5月28日
    00
  • 简单了解vue 插值表达式Mustache

    下面是“简单了解vue 插值表达式Mustache”的完整攻略。 插值表达式Mustache 在Vue.js中,使用Mustache语法(双大括号,即{{}})可以用于实现对数据的简单渲染,这种方式被称为插值表达式Mustache。在Vue实例中使用Mustache语法可以对绑定到数据的值进行渲染,即实现数据与视图的绑定。 基本使用 使用插值表达式Musta…

    Vue 2023年5月27日
    00
  • 使用vue打包时vendor文件过大或者是app.js文件很大的问题

    处理vue打包时vendor文件过大或者是app.js文件很大的问题可以通过以下方法进行: 1. 使用动态导入 (Dynamic Import) 动态导入是Vue.js 2.6版本开始提供的一个特性,可以让你在运行时(runtime)条件下去组织代码切割,从而减小打包体积。它是通过 import() 语法实现的。使用动态导入可以减少app.js的大小,提高页…

    Vue 2023年5月28日
    00
  • vue+elementUI(el-upload)图片压缩,默认同比例压缩操作

    首先需要明确的是,针对 vue+elementUI(el-upload) 图片压缩的操作,实际上是对于上传的图片进行处理,通过 JS 将图片进行压缩,最终实现 web 应用中图片大小的限制。 接下来,我们将分别从以下三个方面对此进行详细讲解: 图片选择与压缩 解决压缩后图片失去原有宽高比例的问题 示例说明 1. 图片选择与压缩 我们可以通过 elementU…

    Vue 2023年5月28日
    00
  • vuejs中使用mixin局部混入/全局混入的方法详解

    下面我详细讲解下“vuejs中使用mixin局部混入/全局混入的方法详解”。 什么是Mixin? 在VueJS中,Mixin是一种可以将多个组件中重复的代码封装成可复用的功能的方法。你可以将一些常见的代码部分提取出来形成一个Mixin对象,然后将它应用到多个组件中去。 全局混入 全局混入是指将Mixin全局应用于所有的Vue实例中去。这样做的好处是可以避免重…

    Vue 2023年5月28日
    00
  • Vue2.x中的Render函数详解

    针对“Vue2.x中的Render函数详解”,我提供以下完整攻略: Vue2.x中的Render函数详解 什么是Render函数 Vue中的Render函数,是指用代码构建虚拟DOM。在模板中,我们可以使用简单的语法来描述HTML结构,但在Render函数中,需要用JavaScript的语法来描述虚拟DOM。 在Vue文档中,Render函数的定义为:“在V…

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