SpringBootStart 组件
如何实现一个springboot-start组件
Person:
- 如何实现一个spring boot start 组件
ChatGPT:
- Spring Boot Starter 是 Spring Boot 提供的一种机制,用于简化依赖的配置和集成。一个 Spring Boot Starter 通常包含了一组相关的依赖、配置、自动配置和其他需要的资源。通过创建自定义的 Starter,你可以将一组功能打包成一个独立的组件,使得其他应用可以轻松引入这个组件并享受相应的功能。
以下是创建一个简单的 Spring Boot Starter 的基本步骤:
- 创建 Maven 项目: 使用 Maven 作为构建工具,创建一个新的 Maven 项目。
- 项目结构: 创建项目的基本结构,其中关键的文件和目录包括:
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 在启动时会自动加载这些配置。
- 编写自动配置类: 在
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();
}
}
- 编写 MyService 类: 在自动配置中使用的类,这里简单地创建了一个示例类。
package com.example;
public class MyService {
public String greet() {
return "Hello from MyService!";
}
}
- spring.factories 文件: 在
META-INF/spring.factories
文件中声明自动配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\\
com.example.MyStarterAutoConfiguration
- 打包和安装: 使用 Maven 打包项目,并将其安装到本地 Maven 仓库。
mvn clean install
- 在其他项目中使用: 在其他 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 的自动配置和条件化配置机制。主要涉及以下几个核心概念:
- 自动配置(Auto-Configuration): Spring Boot Starter 中的核心是自动配置类(
@Configuration
注解标记的类),它们提供了一组默认的配置,使得功能能够自动启用。这些类通常包含@Bean
方法,定义了需要的组件、配置等。 - 条件化配置(Conditional Configuration): 自动配置类上经常使用
@ConditionalOnClass
、@ConditionalOnMissingBean
、@ConditionalOnProperty
等条件注解,以便在特定的条件下才生效。这确保了自动配置只在满足一定条件时生效,避免了对不必要的配置的引入。 - spring.factories 文件: Spring Boot Starter 通过在
META-INF/spring.factories
文件中声明自动配置类的位置,告诉 Spring Boot 在启动时加载哪些自动配置类。Spring Boot 会在 classpath 中查找这个文件,并加载其中声明的配置。 - Maven Coordinates: Spring Boot Starter 需要按照 Maven 的规范组织,并通过 Maven 的坐标(Group ID、Artifact ID、Version)进行标识。其他应用通过引入这个 Maven 依赖来使用 Starter。
- Spring Boot 的启动过程: Spring Boot 在启动时会扫描 classpath 下的所有
META-INF/spring.factories
文件,加载其中声明的配置。然后,根据条件化配置的条件,决定是否应用这些配置。这样,当应用引入了 Starter 时,相关的配置和功能就会被自动集成。
通过这些机制,Spring Boot Starter 可以将一组相关的配置、组件和功能打包成一个独立的组件,并使其易于在其他应用中引入和使用。这样做的好处是可以更好地模块化应用,提高代码的可维护性和可扩展性。
案例分析
案例1: pagehelper-spring-boot-autoconfigure-1.2.10.jar
<aside> 💡 说明:
- 这个组件是一个start组件;
- 这个组件还包含了一个pom.xml包: 其中还引入了其他的依赖(有些依赖可能也是组件)
</aside>
这个就是一个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>