SpringBootStart 组件

如何实现一个springboot-start组件

Person:

  • 如何实现一个spring boot start 组件

ChatGPT:

  • Spring Boot Starter 是 Spring Boot 提供的一种机制,用于简化依赖的配置和集成。一个 Spring Boot Starter 通常包含了一组相关的依赖、配置、自动配置和其他需要的资源。通过创建自定义的 Starter,你可以将一组功能打包成一个独立的组件,使得其他应用可以轻松引入这个组件并享受相应的功能。

以下是创建一个简单的 Spring Boot Starter 的基本步骤:

  1. 创建 Maven 项目: 使用 Maven 作为构建工具,创建一个新的 Maven 项目。
  2. 项目结构: 创建项目的基本结构,其中关键的文件和目录包括:
my-starter
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── MyStarterAutoConfiguration.java
│   │   └── resources
│   │       └── META-INF
│   │           └── spring.factories
│   └── test
└── pom.xml

  • MyStarterAutoConfiguration.java: 包含自动配置类,配置你的 Starter 的核心逻辑。
  • META-INF/spring.factories: 声明自动配置类的位置,Spring Boot 在启动时会自动加载这些配置。
  1. 编写自动配置类:MyStarterAutoConfiguration.java 中编写你的自动配置类。这个类应该使用 @Configuration 注解,并包含一些带有 @Bean 注解的方法,提供你的功能。
package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyStarterAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

  1. 编写 MyService 类: 在自动配置中使用的类,这里简单地创建了一个示例类。
package com.example;

public class MyService {

    public String greet() {
        return "Hello from MyService!";
    }
}

  1. spring.factories 文件:META-INF/spring.factories 文件中声明自动配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\\
com.example.MyStarterAutoConfiguration

  1. 打包和安装: 使用 Maven 打包项目,并将其安装到本地 Maven 仓库。
mvn clean install

  1. 在其他项目中使用: 在其他 Spring Boot 项目的 pom.xml 文件中引入你的 Starter。
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>my-starter</artifactId>
        <version>1.0.0</version> <!-- 版本号根据实际情况修改,具体取决于install生成的那个版本 -->
    </dependency>
</dependencies>

Spring Boot 会自动检测你的 Starter,并将相关的配置和功能集成到应用中。

这是一个简单的 Spring Boot Starter 的创建过程。实际上,一个 Starter 可能还包含其他的配置、资源文件、条件化的自动配置等。详细的开发和设计可以根据你的实际需求进行扩展。

Person:

原理是什么呢?

ChatGPT:

  • Spring Boot Starter 的原理基于 Spring Boot 的自动配置和条件化配置机制。主要涉及以下几个核心概念:
  1. 自动配置(Auto-Configuration): Spring Boot Starter 中的核心是自动配置类(@Configuration 注解标记的类),它们提供了一组默认的配置,使得功能能够自动启用。这些类通常包含 @Bean 方法,定义了需要的组件、配置等。
  2. 条件化配置(Conditional Configuration): 自动配置类上经常使用 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty 等条件注解,以便在特定的条件下才生效。这确保了自动配置只在满足一定条件时生效,避免了对不必要的配置的引入。
  3. spring.factories 文件: Spring Boot Starter 通过在 META-INF/spring.factories 文件中声明自动配置类的位置,告诉 Spring Boot 在启动时加载哪些自动配置类。Spring Boot 会在 classpath 中查找这个文件,并加载其中声明的配置。
  4. Maven Coordinates: Spring Boot Starter 需要按照 Maven 的规范组织,并通过 Maven 的坐标(Group ID、Artifact ID、Version)进行标识。其他应用通过引入这个 Maven 依赖来使用 Starter。
  5. Spring Boot 的启动过程: Spring Boot 在启动时会扫描 classpath 下的所有 META-INF/spring.factories 文件,加载其中声明的配置。然后,根据条件化配置的条件,决定是否应用这些配置。这样,当应用引入了 Starter 时,相关的配置和功能就会被自动集成。

通过这些机制,Spring Boot Starter 可以将一组相关的配置、组件和功能打包成一个独立的组件,并使其易于在其他应用中引入和使用。这样做的好处是可以更好地模块化应用,提高代码的可维护性和可扩展性。

案例分析

案例1: pagehelper-spring-boot-autoconfigure-1.2.10.jar

<aside> 💡 说明:

  1. 这个组件是一个start组件;
  2. 这个组件还包含了一个pom.xml包: 其中还引入了其他的依赖(有些依赖可能也是组件)

</aside>

Untitled

这个就是一个start组件。 其中spring.factories 中配置了PageHelperAutoConfiguration 类,源码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.github.pagehelper.autoconfigure;

import com.github.pagehelper.PageInterceptor;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration **// 自动配置类,会被springboot的IOC容器管理
// 条件注解:当容器中存在 SqlSessionFactory 的 Bean 时,才会生效。换句话说,这个自动配置类只有在项目中配置了 MyBatis 的**
@ConditionalOnBean({SqlSessionFactory.class}) 
// 这个注解用于启用配置属性绑定,将 PageHelperProperties 类的属性值绑定到配置文件中配置的对应属性。
// PageHelperProperties 通常包含了 PageHelper 插件的各种配置项。
****@EnableConfigurationProperties({PageHelperProperties.class})
// 这个注解表示,在 MybatisAutoConfiguration 自动配置类之后自动配置。这确保了在配置 PageHelper 时,
// MyBatis 的相关配置已经完成,以便 PageHelper 可以正确地集成到 MyBatis 中。
@AutoConfigureAfter({MybatisAutoConfiguration.class})
public class PageHelperAutoConfiguration {
    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;
    @Autowired
    private PageHelperProperties properties;

    public PageHelperAutoConfiguration() {
    }

    @Bean
    @ConfigurationProperties(
        prefix = "pagehelper"
    )
    public Properties pageHelperProperties() {
        return new Properties();
    }

    @PostConstruct
    public void addPageInterceptor() {
        PageInterceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.putAll(this.pageHelperProperties());
        properties.putAll(this.properties.getProperties());
        interceptor.setProperties(properties);
        Iterator var3 = this.sqlSessionFactoryList.iterator();

        while(var3.hasNext()) {
            SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)var3.next();
            sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
        }

    }
}

<aside> 💡 总体而言,这个自动配置类的作用是在 Spring Boot 项目中自动配置 PageHelper。它会检查项目中是否已经配置了 SqlSessionFactory(通常是 MyBatis 的配置),如果是,则会根据 PageHelperProperties 中的属性值配置 PageHelper。这样,开发者在使用 pagehelper-spring-boot-starter 时,无需手动配置 PageHelper,而是通过简单的依赖注入和配置文件设置来实现分页插件的集成。

</aside>

posted @ 2024-10-24 22:27  BlakeYa  阅读(1)  评论(0编辑  收藏  举报