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.js 遇到的那些坑

    学习Vue.js遇到的坑可以总结为以下几点: 1. 环境搭建 Vue.js是基于Vue-cli脚手架搭建的,我们需要先安装Node.js和npm,然后通过npm安装Vue-cli。在使用Vue-cli创建项目时,需要选择不同的模板,如Webpack、Browserify等。选择合适的模板会影响到后续的开发和打包。 示例: 安装Vue-cli命令: npm i…

    Vue 2023年5月28日
    00
  • vue3中的ref()详解

    那我就来详细讲解一下”vue3中的ref()详解”的攻略。 简介 ref函数是Vue 3中的一个响应式API,它不仅可以用来创建响应式数据,还可以用来在模板或JSX中访问元素和组件。 创建响应式数据 在Vue.js 2.X版本中,创建响应式数据需要用到 Vue 对象的 data 选项,通常需要在组件的 data 函数中返回一个对象。 而在Vue.js 3.0…

    Vue 2023年5月28日
    00
  • vue项目是如何运行起来的

    关于Vue项目的运行过程,可以分为三个阶段: 项目初始化 打包构建 运行阶段 1. 项目初始化 在开始开发Vue项目之前,需要先进行初始化操作。可以使用Vue脚手架工具Vue CLI来创建一个基于Webpack的Vue项目模板,命令如下: vue create my-project 以上命令将在当前目录下创建一个名为my-project的项目,并自动下载需要…

    Vue 2023年5月28日
    00
  • 简单理解Vue中的nextTick方法

    下面是详细讲解Vue中的nextTick方法的攻略。 什么是nextTick方法? nextTick方法是Vue的一个异步方法,使用它可以让我们在DOM更新后执行一些操作。它接受一个回调函数作为参数,在这个回调函数里我们可以执行我们需要的操作。 nextTick方法的使用 在DOM更新后执行方法 通过nextTick方法我们可以在DOM更新后执行方法。这在我…

    Vue 2023年5月29日
    00
  • vue3源码剖析之简单实现方法

    Vue3源码剖析之简单实现方法 前言 Vue3是一个新一代的前端开发框架,它重点突出了响应式原理、Composition API、性能优化等方面的特点。如果想要深入学习Vue3框架,那么学习其源码是非常必要的一步。本文将简单介绍Vue3的源码剖析方法和实现步骤。 实现步骤 1. 环境配置 首先,我们需要配置一个Vue3的开发环境,这里我们推荐使用Vite进行…

    Vue 2023年5月27日
    00
  • Vue项目中数据的深度监听或对象属性的监听实例

    在Vue项目中,如果需要监听数据的变化,可以使用Vue提供的语法糖——$watch来实现。$watch支持监听某个具体的数据对象以及数据对象中的属性。 监听某个具体的数据对象 监听某个具体的数据对象可以通过在Vue实例中使用$watch方法来实现。下面是一个示例: // 假设我们有一个Vue实例,并且其中有一个name属性 var vm = new Vue(…

    Vue 2023年5月28日
    00
  • vue-cli npm如何解决vue项目中缺失core-js的问题

    当我们创建一个Vue项目时,通常会使用vue-cli来进行项目初始化和配置。但是,在某些情况下,会在编译或运行Vue应用程序期间遇到缺少“core-js”的错误。这时,我们可以使用npm来安装“core-js”,以解决这个问题。 下面是解决“vue-cli npm如何解决vue项目中缺失core-js的问题”的完整攻略: 步骤1:检查缺少“core-js”的…

    Vue 2023年5月28日
    00
  • 解决antd日期选择组件,添加value就无法点击下一年和下一月问题

    对于 Ant Design 的日期选择组件 DatePicker,如果我们在使用时添加了 value 属性,会发现无法点击下一年和下一月。这是因为添加了 value 属性后,Ant Design 会把组件的选中日期固定为这个值,并禁用掉下一年和下一月的按钮。解决这个问题的方法非常简单,在代码中添加一个叫做 allowClear 的属性,并将该属性的值设为 t…

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