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 方式提供给业务方使用。这样可以让服务划分指责更加清晰,而且保证提供组件不会增加原始服务的运行负担,保证微服务


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


参考文档




相关文章
|
9天前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
9天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
16天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
64 14
|
15天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
77 3
|
1月前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
56 14
|
27天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
62 8
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
109 5
|
29天前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
66 2
|
2月前
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
50 5
|
2月前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
52 5