「javaspi架构」JAVA技术架构
今天给各位分享javaspi架构的知识,其中也会对JAVA技术架构进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
扩展点设计
02_扩展点设计
供应链的业务中,一个业务流程涉及到多个节点,并且每个节点的实现逻辑不同,如下图所示
每一个节点都可能存在不同的实现,有时候需要从多个实现中选择一个(互斥),有时候需要选择多个(组合)。如果不对各种实现进行良好的管理,带来的问题是:
针对于上一节中提到的节点多种实现的问题,Java的SPI可以解决我们的问题。
Java SPI使用约定:
1、当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
2、接口实现类所在的jar包放在主程序的classpath中;
3、主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;
4、SPI的实现类必须携带一个不带参数的构造方法;
扩展点(ExtensionPoint)必须通过接口申明,扩展实现(Extension)是通过Annotation的方式标注的,Extension里面使用BizCode和TenantId两个属性用来标识身份,
框架的Bootstrap类会在Spring启动的时候做类扫描,进行Extension注册,在Runtime的时候,通过TenantContext来选择要使用的Extension。TenantContext是通过Interceptor在调用业务逻辑之前进行初始化的。整个过程如下图所示:
扩展点实现路由
比如在一个CRM系统里,客户要添加联系人Contact是一个,但是在添加联系人之前,我们要判断这个Contact是不是已经存在了,如果存在那么就不能添加了。不过在一个支持多业务的系统里面,可能每个业务的冲突检查都不一样,这是一个典型的可以扩展的场景。
那么在SOFA框架中,我们可以这样去做。
2、实现业务的扩展实现
3、在领域实体中调用扩展实现
cola扩展点的缺陷:
扩展点必须以ExtPt结尾,通过ExtPt明显标识这是一个扩展点,扩展点实现类以Ext结尾
用在扩展点实现类上,使用该注解,会将实现类注入到spring容器中
1、基于Strategy Pattern的扩展,没有找到一个很好的固化到框架中的方法
2、使用Strategy Pattern,没有规范的限制,编码相对随意
Java spi属于什么设计模式
7 SPI模式 7.1 介绍 SPI模式由一个由基于闪存
SD存储卡提供的次要通信协议组成.此模式是SD存
储卡协议的子集。此接口在上电(CMD0)后的每一个复位命令期间被选择。 SPI标准只定义物理链接,而不提供数据传输协议。SD存储卡SPI执行利用SD存储卡协.
SPI用法简介
spi是Service Provider Interface的缩写。使用spi技术可以通过修改配置的方式,更换程序中某个接口的实现类,从而改变程序行为。spi的用法如下:
建立文件META-INF\services\com.foo.bar.service.FooService,写入下面两行:
编辑文件META-INF/services/java.sql.Driver,加入所需要的驱动类。
参考资料
基于spring factories机制开发SDK
SPI机制:为某个接口寻找服务实现的机制
java SPI就是提供这样的一个机制 ,需要在META-INF目录中设置接口的实现,以实现服务接口与实现的解耦。第三方服务厂商或者插件服务,可以依据SPI机制,实现功能扩展。
在Spring中也有一种类似与Java SPI的加载机制。它在META-INF/spring.factories文件中配置接口的实现类,我们成为Spring factories机制,基于此我们可以自定义stater或SDK供他人使用,项目只在pom.xml中引入SDK,无须配置即可实现功能集成。
最近的需求为例,需要实现授权功能SDK,以供其他产品使用
项目目录结构如下
第一步:在包名root目录下创建自动配置类 EsbrSdkAutoConfig
内容如下:添加
@Configuration
@ComponentScan(basePackageClasses = EsbrSdkAutoConfig.class)
标识此类为配置类,并配置扫描路径为当前类
第二步; 在resources/META-IN目录下,创建spring.factories文件
内容如下:
将org.springframework.boot.autoconfigure.EnableAutoConfiguration的自动配置为值设置为第一步的EsbrSdkAutoConfig的全限定类名(包名+类名)
第三步:编写SDK的Service
通过以上三步,即可基于Spring factories机制完成自定义Starter,在其他项目pom.xml中引入该starter即可
是不是很简单,下面讲解下原理
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件中的配置,
并通过 loadFactoryNames方法() 获取其接口类的名称
在这个方法中会遍历整个ClassLoader中所有jar包下的spring.factories文件。也就是说我们可以在自己的jar中配置spring.factories文件,不会影响到其它地方的配置,也不会被别人的配置覆盖。
将org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.org.bjca.esbr.sdk.EsbrSdkAutoConfig
基于springboot自动配置,会扫描并初始化EsbrSdkAutoConfig类,并将EsbrSdkAutoConfig作为basepackage,扫描改类及其该类子包下的类,加载到spring容器。
javaspi架构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于JAVA技术架构、javaspi架构的信息别忘了在本站进行查找喔。
发布于:2022-12-04,除非注明,否则均为
原创文章,转载请注明出处。