教你如何使用Spring Boot实现模块化

SpringBoot多模块项目开发(Maven多模块项目) 在需要统一版本的位置,使用 ${自定义标签名} 引用声明的版本号。另外,自定义标签声明数据的配置并不是只能用于声明依赖的版本号,凡是需要统一声明后再引用的场合都可以使用,例如:统一配置项目构建的源码的字符集格式。xml复制代码。 阅读详情

使用Spring Boot实现模块化

一般情况下,一个SpringBoot应用 = 一个微服务 = 一个模块 = 一个有边界的上下文,如果有多个模块,我们就开发多个微服务,多个SpringBoot应用,然后使用Springcloud实现它们之间动态访问和监控。 但是有时我们也会希望将多个模块放入一个SpringBoot应用中,这样模块之间调用可以在一个JVM内进行,适合小型系统的部署,随着规模扩大,我们还可将这些模块变成一个个微服务,以SpringBoot应用分布式运行。

SpringBoot为模块化提供了非常直接简单的组合方式,可以说完全替代OSGI或其他模块插件技术。

什么是Spring Boot中的模块?

本文意义上的“模块”是一组加载到应用程序上下文中的Spring组件。

模块可以是业务模块,为应用程序提供一些业务服务,或者为几个其他模块或整个应用程序提供跨领域关注的技术模块。

创建模块的几种办法

Spring模块的基础是一个@Configuration注释,这是一种Spring的Java配置特性,可以用来标注在你的模块配置类中,配合@Configuration有几种更细粒度的方式: (1)@ComponentScan 创建模块的最简单方法是使用@ComponentScan注释:

@Configuration @ComponentScan(basePackages = "io.reflectoring.booking") public class BookingModuleConfiguration { }

如果这个配置类由importing 机制(稍后解释)导入的一个,它将查看包io.reflectoring.booking中的所有类,如果使用了Spring的构造型注释中任何一个注释,这些类的实例将被加载到Spring的应用上下文中。 只要你总是希望将包及其子包的所有类加载到Spring应用上下文中,那么使用这种方式就可以了。如果你需要更多控制加载内容,请继续。。 (2)@Bean 定义 Spring的Java配置功能还有一个@Bean注释,用于创建加载bean的实例到Spring应用上下文中:

@Configuration public class BookingModuleConfiguration { @Bean public BookingService bookingService(){ return new BookingService(); } // potentially more @Bean definitions ... } <p class="indent">

导入此配置类时,BookingService实例将被创建并插入Spring的应用上下文中。 使用这种方式进行模块的创建就可以更清楚地了解实际加载的bean,因为你只需要查看一个地方(配置类),更方便 ,这种办法与使用@ComponentScan地方相比,后者需要你查看包中所有类的构造型注释,看看是什么构造型,符合条件才能被加载。 (3)@Conditional 注释 如果你需要对哪些组件应该加载到Spring应用上下文中要进行更细粒度的控制,则可以使用Spring Boot的@Conditional...注释:

@Configuration @ConditionalOnProperty(name = "io.reflectoring.security.enabled", havingValue = "true", matchIfMissing = true) public class SecurityModuleConfiguration { // @Bean definitions ... } <p class="indent">

在使用这个模块时,必须在application配置文件中设置属性io.reflectoring.security.enabled为true才能使用这个模块。(见后面使用模块) 还可以使用其他@Conditional...注释来定义加载模块的条件。有一个依赖条件,具体取决于JVM的版本以及某个类是否存在于类路径中或某个bean是否存在于Spring应用上下文中。 如果你曾经问​​过自己Spring Boot如何神奇地将应用程序所需的bean加载到应用程序上下文中,原理就在于使用了这个注释@Conditional,Spring Boot本身大量使用@Conditional注释。 以上三种办法是创建一个模块的方式,那么如何使用这些模块呢?也有几种方式可选,注意,要分清模块创建和模块使用两个大的边界。

使用模块的几种办法

创建模块后,我们需要将其导入到SpringBoot应用程序中,有下面几种办法: (1)@Import 最直接的方法是使用@Import注释:

@SpringBootApplication @Import(BookingModuleConfiguration.class) public class ModularApplication { // ... } <p class="indent">

这将导入BookingModuleConfiguration类及其随附的所有bean - 无论它们是由声明@ComponentScan还是@Bean注释。 (2)@Enable... 注释 Spring Boot带有一组注释,每个注释都自己导入某个模块。一个例子是@EnableScheduling,它导入调度子系统所需的所有Beans及其@Scheduled注释,也就是说,如果你在你的应用类中使用了@Scheduled注释,如果想使得这种调度功能起效,还必须在入口处加入@EnableScheduling,否则就不起效,这也是SpringBoot使用中容易掉的坑,关键还是没有了解Spring的模块机制:

@SpringBootApplication @EnableScheduling public class SpringbatchApplication { public static void main(String[] args) { SpringApplication.run(SpringbatchApplication.class, args); } } <p class="indent">

我们也可以导入自己的Enable配置:

@SpringBootApplication @EnableBookingModule public class ModularApplication { public static void main(String[] args) { SpringApplication.run(ModularApplication.class, args); } } <p class="indent">

上面代码中EnableBookingModule不是Spring自己的注释,而是我们自己的定做的,代码如下:

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Import(BookingModuleConfiguration.class) @Configuration public @interface EnableBookingModule { } <p class="indent">

该@EnableBookingModule注释实际上只是包装了@Import,首先导入我们的BookingModuleConfiguration,如果我们有一个模块是由多个配置类组成,这种办法是一种将这些配置类聚合到单个模块中的方便且富有表现力的方法。 (3)自动配置Auto-Configuration 如果我们想自动加载模块而不是将之前那样在源代码中导入指定的硬连接hard-wiring,我们可以使用Spring Boot的自动配置功能,也就是不再源代码中使用注释,而是使用配置文件。 请在模块所在项目下(注意,不是模块使用的项目)建立文件META-INF/spring.factories,运行时需要放入classpath类路径中 ,在该文件中写入:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ io.reflectoring.security.SecurityModuleConfiguration <p class="indent">

多个配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration <p class="indent">

该模块的使用者所在Springboot项目启动时会将SecurityModuleConfiguration类的所有bean导入到Spring应用上下文中。 要在SpringBoot中使用这个SecurityModuleConfiguration,还需要在模块使用的项目中在application.yml中定义:

io: reflectoring: security: enabled: true <p class="indent">

这里将io.reflectoring.security.enabled设置true,是对应前面该模块创建时使用@Conditional注释时有一个条件:

@ConditionalOnProperty(name = "io.reflectoring.security.enabled", havingValue = "true", matchIfMissing = true) <p class="indent">

使用模块的策略

前面介绍了在Spring Boot应用程序中使用模块的几个办法,但是我们什么时候在什么情况下选择哪一个呢?

(1)业务模块使用@Import 对于包含业务逻辑的模块 - 比如上面的BookingModuleConfiguration - 在大多数情况下使用@Import,使用带注释的静态导入应该足够了。通常那些没有加载业务模块也是没有意义的,因此我们不需要对它们的加载条件进行任何控制。

(2)技术模块使用自动配置 另一方面,技术性的模块 - 如安全SecurityModuleConfiguration - 这些技术通常会提供一些跨域的切面关注(类似AOP),例如日志记录,异常处理,授权或监视功能,这些功能在开发和运行时需求不一样,在开发过程中,可能根本不需要这些功能,因此我们希望有一种方法来禁用它们。

我们不希望使用@Import静态地导入每个技术模块,因为它们不应该对我们的代码产生任何影响。 因此,使用技术模块的最佳选择是自动配置功能。模块在后台静默加载,我们可以使用在代码之外配置属性中影响它们。

Spring Boot Starter 超详解:构建模块化、高效 Spring Boot 应用的基石 理解 Starter 的原理、掌握自定义 Starter 的方法,是 Spring Boot 开发者进阶的必经之路。希望本文能够帮助您深入理解 Spring Boot Starter 的奥秘,并在实际开发中灵活运用,构建出更强大的 Spring Boot 应用!列举一些常用的 Spring Boot 官方 Starter,并简要介绍其功能,方便读者快速了解和选择合适的 Starter。,助您彻底掌握 Starter 的精髓,构建更优雅、更可维护的 Spring Boot 应用。 阅读详情

相关推荐

Spring Boot系列十三 Spring Boot集成RabbitMQ

1. 概述之前我有一系列关于RabbitMQ文章介绍了RabbitMQ的用法,本篇我们介绍如何在Spring Boot中集成RabbitMQ。本篇主要内容如下: 在Spring boot中消息的发送和接收的两种方式的demo 配置使用MessageConverter对消息序列化 2. Demo工程公共部分介绍工程名称:rabbitmq需要在我们的工程中的pom.xml引入新jar <!-- spri

不积跬步无以至千里; 不积小流无以成江海 1万+

Spring对java模块化支持_Spring Boot实现模块化的几种方法

一般情况下,一个SpringBoot应用 = 一个微服务 = 一个模块 = 一个有边界的上下文,如果有多个模块,我们就开发多个微服务,多个SpringBoot应用,然后使用Springcloud实现它们之间动态访问和监控。 但是有时我们也会希望将多个模块放入一个SpringBoot应用中,这样模块之间调用可以在一个JVM内进行,适合小型系统的部署,随着规模扩大,我们还可将这些模块变成一个个微服务,...

weixin_42300090的博客 758

Spring Boot模块化开发:@Import注解的应用

可见借助@Import注解,可以很方便地实现自定义导入对应的配置类,甚至是新增扫描起点,这对于我们Spring Boot模块化开发是一个有利的工具。也可见该注解功能非常强大,可以通过实现对应接口方法,完成灵活地自定义导入。大家需要理解@Import注解具体作用是什么,以及该注解可以传入哪些类作为参数,以及其大致的工作流程。

tangjieqing的博客 1148

知识点19--springboot多模块开发

本篇向大家介绍本系列demo教程中最后一个知识点就是多模块开发,多模块听着高大上,其实就是依靠maven相互之间的依赖,把多个模块融合进一个项目中而已,说的再直白一些就是像日常开发那样把其他模块导入一个模块,这个模块用来启动并调用所有模块而已。下面通过一个例子整体走一遍模块化开发。第一步:建立父工程,注意通常情况下,父工程一定是一个spring initializr模式下创建出来的,但同样存在少量的人会先创建maven在转换成spring boot项目,这个其实就是手动添加所有依赖而已。

别人笑我太疯癫,我笑他人看不穿。 8423

使用Spring Boot Admin对Spring Boot项目进行监控

前言 Spring Boot Admin 是一款开源的用来监控服务状态的工具,核心是Spring Boot Actuator,Spring Boot Admin在其基础上,通过AngularJs对其实现了可视化的展现。Spring Boot Admin 由server和client两部分组成,为了实现监控的功能,我们需要实现一个server,而每一个被监控的Spring Boot 服务可以视为一个...

白鹭立雪的博客 4407

使用Spring Boot实现GraphQL

开发环境 Windows10 Java 11(采用OpenJDK jdk11.0.4+11 OpenJ9 0.15.1) Maven 3.5.4 STS 4.4.0

JavaShark的博客 2850

Spring Boot模块化开发的5种组织方式

Bean@Bean@Bean@Bean# 在应用配置文件中@Service@AutowiredSpringBoot模块化开发提供了多种组织方式,每种方式都有其适用场景和优缺点。选择合适的模块化策略应考虑项目规模、团队结构、业务复杂度和未来演进方向。最重要的是,模块化应该是渐进式的过程,随着项目的发展不断调整和优化模块结构,以适应不断变化的业务需求和技术环境。无论选择哪种模块化方式,清晰的模块边界、良好的接口设计和适当的耦合度控制都是成功的关键因素。

xiangzhihong8的专栏 1152

spring boot-使用Filter实现Header认证

前言 假设客户端在http请求中,已经加入了Header的认证信息,例如: HttpPost post = new HttpPost("http://localhost:8990/sendMail"); StringEntity entity = new StringEntity(json, "utf-8"); entity.setContentType("applicatio

牛奋lch 2万+

Spring Boot:模块化实战 - 保持清晰架构

Spring Boot:模块化实战 - 保持清晰架构

weixin_46619605的博客 2305

社区版IDEA也能爽写Spring Boot?手把手教你装Spring Boot Assistant插件搞定yml提示

本文深度评测Spring Boot Assistant插件如何为IntelliJ IDEA社区版用户提供接近专业版的Spring Boot开发体验。重点解析插件的YAML智能提示、项目创建向导和注解增强功能,并提供详细的安装配置指南与效率提升技巧,帮助开发者在不升级专业版的情况下提升Spring Boot开发效率。

chushang0934的博客 1138

Spring Boot进阶(70):如何在Spring Boot中使用FastJson实现高效的JSON数据处理?

本文将首先介绍FastJson的基本概念,接下来将介绍如何在Spring Boot中集成FastJson,并通过实例来演示FastJson在Spring Boot中的应用。

**My Coding Family** 7952

如何使用Spring Boot轻松实现国际化和本地化

轻松实现国际化

做一个有思想的技术人 4108

springboot 模块化开发例子

以SpringBoot 为中心,模块化开发系统,用户可以随意删减除权限框架外 任意的系统模块。复用,组装性强。2种打包方式,传统可运行的tomcat目录 以及直接jar 方式运行。主要应用技术:SpringSecurity+Ehcache+quartz+swagger2+Mysql5.6.... 主要包含系统全方位监控,权限管理。定时任务,API在线接口,OSS云存储,第三方登录,在线支付,代码生成等内容。适合单机型框架开发

Spring Boot模块化配置原理解析

起步依赖:统一管理模块化功能所需的依赖。自动配置:基于类路径和条件注解动态加载组件。外部化配置:允许灵活覆盖默认值。条件化配置:确保按需加载,避免冗余。这些机制共同实现了“约定优于配置”(Convention Over Configuration),开发者只需关注业务代码,无需手动编写大量模板化配置。

小野喵喵。的博客 711

LTE信令流程——切换

LTE信令流程 切换 切换是由基站发起的,不同于小区重选,小区重选是由UE发起的。 基站利用移动性管理算法给UE下发测量任务,在RRC重配置消息中携带MeasConfig信元给UE下发测量配置 切换有三种场景: 同一基站内不同小区的切换 不同基站间基于X2的切换(MME不变) 不同基站间基于S1的切换(MME/SGW可能改变) 1. 同一基站内不同小区的切换 连接态的UE在一个基站的不同小区之间移动 UE上报合适的测量报告(Measure Reports),触发基站切换 基站下发切换命令给UE,

Hxx的博客 1万+

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 246

Spring Boot系列七 实现自己的spring boot starter工程

spring boot starter工程对于使用者是非常方便的,使用者通常只要在pom.xml引入starter的jar,则此工程依赖的类,就全部自动引入。因此我们常用的开源组件都会提供一个start工程给开发者,让开发者非常方便集成本组件到spring中。本文通过自己实现一个简单的demo,详细说明了如何实现一个自己的spring boot starter工程。

不积跬步无以至千里; 不积小流无以成江海 9406

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

孟孟单单的博客 7万+

Spring Boot模块化架构实战指南:高效构建企业级应用

Spring Modulith作为Spring官方推出的模块化开发框架,为构建大型企业应用提供了完整的架构解决方案。本文将深入探讨如何利用模块化架构设计思想,在Spring Boot应用中实现清晰的模块边界、自动依赖检测和事件驱动通信,帮助开发者告别传统单体应用的依赖混乱问题。 ## 🎯 企业应用架构的痛点与解决方案 ### 传统单体架构的挑战 在大型企业级应用开发过程中,随着业务复杂度的

gitblog_00878的博客 868

LPDDR4x 深度解析(3) - SDRAM核心操作机制

本文深入解析LPDDR4x SDRAM的核心操作机制,包括基础架构、刷新操作、读写流程及低功耗设计。详细介绍了存储阵列、地址解码器等关键模块,以及自刷新与自动刷新模式的区别。通过实测数据和技术细节,揭示LPDDR4x在性能优化和功耗控制方面的创新设计,为硬件工程师提供实用参考。

weixin_29278805的博客 308

初识 QML

QML 是一种声明性语言,允许根据用户界面的可视组件以及它们如何相互交互和相互关联来描述用户界面。QML 是一种高度可读的语言,旨在使组件能够以动态方式互连,并且允许组件在用户界面中轻松重复使用和自定义。 使用 Qt Quick,开发人员可以轻松地在 QML 中构建流体动画用户界面,并且可以选择将这些用户界面连接到任何后端 C++ 库。

青春不老,奋斗不止! 1万+
上一篇: 简短解析浅述SpringBoot六边形架构案例
下一篇: Redis在微服务架构中的几种应用场景
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值