Spring Boot 自定义组件实践

简介: Spring Boot 自定义组件实践

定义 starter


首先需要定义我们自己的 starter


导入依赖和 artifactId定义


这里说下 artifactId的命名问题,Spring 官方 Starter 通常命名为 spring-boot-starter-{name} 如 spring-boot-starter-web,Spring 官方建议非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式。举个例子:mybatis-spring-boot-starterdubbo-spring-boot-starter.


<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>


添加配置


resources/META-INF下创建 spring.factories 文件。参考如下:


org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ssm.xyz.config.ExampleAutoConfigure


spring.factories 在哪里读取的呢?大家可能有这个问题。


在我们的 Spring-Boot 的启动类上定义了@SpringBootApplication注解包含了@EnableAutoConfiguration 然后这个注解内部包含

@Import({AutoConfigurationImportSelector.class}) 通过这个AutoConfigurationImportSelector读取了所有依赖 jar 的 spring.factories文件配置的注解类。


关键点就是@Import这个注解。这个注解可以导入selector,也可以直接导入configruration类。


业务实现


说一实现,我们通自定义 ExampleService可以对字符串进行统一的 wrap操作为字符串添加一个固定的前缀,其实本质就是替换一个 StringUtil 工具方法。


public class StringUtil {
  public static String wrap(String str) {return "PrefixXXX" + str;}
}


下面我们开始组件定义方式的功能实现, ExampleAutoConfigure用来初始化组件内的 Bean ExampleServicePropertiesExampleService:


package com.ssm.xyz.config;
@Configuration
@ConditionalOnClass(ExampleService.class)
@EnableConfigurationProperties(ExampleServiceProperties.class)
public class ExampleAutoConfigure {
    @Autowired
    private ExampleServiceProperties properties;
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")
    ExampleService exampleService (){
        return  new ExampleService(properties.getPrefix());
    }
}


配置文件接受,这里使用的是 @ConfigurationProperties方法读取配置,会去读取 example.service前缀的配置如果通过属性文件设置的话,我们可以配置 example.service.prefix = zhangsan hello


@ConfigurationProperties("example.service")
public class ExampleServiceProperties {
    private String prefix;
}


ExampleService#wrap() 本方法是核心代码,主要是实现组件的核心逻辑,如果后续其他业务,可以修改这个 wrap 方法


public class ExampleService {
    private String prefix;
    public ExampleService(String prefix {
        this.prefix = prefix;
    }
    public String wrap(String word) {
        return prefix + word + suffix;
    }
}


使用 starter


上面我们完成了自定义 starter 的开发,下面我们只需要导入我们的 starter 然后我们 Spring-Boot 在启动的时候就会自动会我们读取配置,然后进行初始化,注入到我们使用的地方。在业务开发的时候我们就可以直接使用。


导入组件依赖


使用 starter 之前需要导入依赖(导入组件之前需要提前对定义的组件进行 deploy 不然可能出现无法以依赖的问题,这个也是我们经常容易犯的一个错误):


<dependency>
  <groupId>com.ssm</groupId>
  <artifactId>example-spring-boot-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>


测试类文件


为了方便和简单,我就把 Controller 和 Application 放在一起,我们对外暴露一个 /input 接口, 对传入的 word 进行 wrap 。代码操作如下:


@SpringBootApplication
@RestController
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Autowired
    private ExampleService exampleService;
    @GetMapping("/input")
    public String input(@RequestParam("word") String word){
        return exampleService.wrap(word);
    }
}


访问地址:http://127.0.0.1:8080/input?word=word! 输出结果


hello word!


Spring Boot 自定义组件总结


组件定义权衡的问题,如果我们是一个本地运行程序比如:通过 IP库逆向解析为地址信息、或者发邮件消息推送等组件。个人觉得可以把这些能力封装成一个服务,通过封装 client-sarter 方式提供给业务方使用。这样可以让服务划分指责更加清晰,而且保证提供组件不会增加原始服务的运行负担,保证微服务


还有一个问题就是组件粒度的问题,这个需要结合具体的业务场景和需求,感觉是一个仁者见仁智者见智问题。


参考文档




相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
9942 60
|
1月前
|
监控 安全 Java
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
Spring Boot 通过 Actuator 模块提供了强大的健康检查功能,帮助开发者快速了解应用程序的运行状态。默认健康检查可检测数据库连接、依赖服务、资源可用性等,但在实际应用中,业务需求和依赖关系各不相同,因此需要实现自定义健康检查来更精确地监控关键组件。本文介绍了如何使用 @HealthEndpoint 注解及实现 HealthIndicator 接口来扩展 Spring Boot 的健康检查功能,从而提升系统的可观测性与稳定性。
100 0
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
|
6月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
604 4
|
7月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
262 0
|
6月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
729 0
|
6月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
177 0
|
3月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
232 0
|
3月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
127 0
|
6月前
|
Java 开发者 微服务
Spring Cloud OpenFeign详解与实践
总结起来说,Spring Cloud OpenFeign提供了一种简单易懂且高效的方式去实现微服务之间通信.它隐藏了许多复杂性,并且允许开发者以声明式方式编写HTTP客户端代码.如果你正在开发基于Spring Cloud 的微服务架构系统,Spring Cloud Open Feign是一个非常好用且强大工具.
420 33