SpringBoot--自定义starter

发布时间:2023年12月25日

自定义starter

创建一个自定义的 Spring Boot Starter,用于提供简单的 REST API 日志记录功能。这个 starter 将使用 spring-boot-starter-logging 依赖,并添加一些额外的配置。

1. 创建项目结构

首先,我们需要创建一个新的 Maven项目,并设置项目的名称、组织和版本。例如:

groupId: com.example
artifactId: api-log-spring-boot-starter
version: 0.0.1-SNAPSHOT

在你的 IDE 中创建这个新项目并确保选择了 Java 和 Spring Boot 版本(推荐使用最新稳定版)。

2. 添加依赖

为了创建一个 Spring Boot Starter,你需要在 pom.xml 文件(对于 Maven)或 build.gradle 文件(对于 Gradle)中添加 Spring Boot 的 BOM(Bill of Materials)依赖。这将帮助你管理 Spring Boot 及其相关库的版本。

Maven:

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

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

3. 创建自动配置类

接下来,我们创建一个名为 ApiLogAutoConfiguration 的自动配置类,该类负责配置我们的 starter 提供的功能。在这个例子中,我们将配置一个简单的日志处理器,用于记录所有 API 请求和响应。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(ApiLogProperties.class)
public class ApiLogAutoConfiguration {

    private static final Log logger = LogFactory.getLog(ApiLogAutoConfiguration.class);

    @Autowired
    private ApiLogProperties properties;

    @Bean
    public FilterRegistrationBean<ApiLoggingFilter> loggingFilter() {
        FilterRegistrationBean<ApiLoggingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new ApiLoggingFilter(properties));
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Component
@Order(1)
public class ApiLoggingFilter implements Filter {

    private static final Log logger = LogFactory.getLog(ApiLoggingFilter.class);
    private ApiLogProperties properties;

    public ApiLoggingFilter(ApiLogProperties properties) {
        this.properties = properties;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        long startTime = System.currentTimeMillis();

        // Process the request and get the response
        chain.doFilter(request, response);

        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;

        if (properties.isEnabled()) {
            Path logFilePath = Paths.get(properties.getLogFile());
            Files.createDirectories(logFilePath.getParent());
            System.out.println(logFilePath.toFile()+"--------------------");
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFilePath.toFile(), true))) {
                writer.write("API Request: " + httpServletRequest.getRequestURI() + ", Response Status: " + httpServletResponse.getStatus() + ", Elapsed Time: " + elapsedTime + "ms\n");
            } catch (IOException e) {
                logger.error("Error writing to log file: " + properties.getLogFile(), e);
            }
        }
    }
}

上面的代码创建了一个名为 ApiLoggingFilter 的过滤器,并将其注册到所有的 URL 路径下。这个过滤器将捕获所有的 HTTP 请求和响应,并将它们记录到日志文件中。

4. 配置 spring.factories 文件

为了让 Spring Boot 自动识别和加载我们的自动配置类,我们需要在 META-INF/spring.factories 文件中指定它们。创建一个名为 spring.factories 的文件,并将其放在项目的 src/main/resources/META-INF 目录下。添加以下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.apilogspringbootstarter.autoconfigure.ApiLogAutoConfiguration

5. 定义属性类

为了允许用户自定义日志行为,我们可以创建一个名为 ApiLogProperties 的类来存储相关的属性。这些属性可以在应用程序的 application.ymlapplication.properties 文件中进行配置。

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "api.log")
public class ApiLogProperties {

    private boolean enabled = true;
    private String logFile;

    // getters and setters

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getLogFile() {
        return logFile;
    }

    public void setLogFile(String logFile) {
        this.logFile = logFile;
    }
}

6. 测试和打包

现在,你可以创建一个简单的 Spring Boot 应用程序来测试你的自定义 starter。在测试应用的 pom.xmlbuild.gradle 文件中添加对自定义 starter 的依赖:

Maven:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>api-log-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

运行测试应用程序,确保你的 starter 正确地提供了所需的功能。

最后,你可以使用 Maven 或 Gradle 来构建和发布你的自定义 starter 到 Maven 中央仓库或其他私有仓库。

结语

通过以上步骤,你应该已经成功地创建了一个自定义的 Spring Boot Starter,用于提供简单的 REST API 日志记录功能。这个starter可以根据你的需求扩展,添加更多功能或者集成其他库。在实际项目中,你可能需要考虑更多的细节,比如错误处理、日志记录、性能优化等。

文章来源:https://blog.csdn.net/m0_69005620/article/details/135199483
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。