初始化 spring cloud 项目的 system 和 infra 模块

This commit is contained in:
YunaiV
2022-06-01 23:59:01 +08:00
parent fcc5180ebf
commit 12e2ce99e1
1138 changed files with 65636 additions and 134 deletions

View File

@@ -0,0 +1,86 @@
package cn.iocoder.yudao.framework.extension.core.factory;
import cn.iocoder.yudao.framework.extension.core.BusinessScenario;
import cn.iocoder.yudao.framework.extension.core.point.ExtensionPoint;
import cn.iocoder.yudao.framework.extension.core.stereotype.Extension;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import javax.validation.constraints.NotNull;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @description 注册工厂
* @author Qingchen
* @version 1.0.0
* @date 2021-08-28 23:07
* @class cn.iocoder.yudao.framework.extension.core.factory.ExtensionRegisterFactory.java
*/
@Component
@Slf4j
public class ExtensionRegisterFactory implements ExtensionFactory {
/**
* spring ApplicationContext
*/
private ApplicationContext applicationContext;
/**
* 扩展点实现类集合
*/
private Map<String, ExtensionDefinition> registerExtensionBeans = new ConcurrentHashMap<>();
@Override
public void register(String basePackage) {
final Map<String, Object> beans = applicationContext.getBeansWithAnnotation(Extension.class);
if(beans == null || beans.isEmpty()) {
return;
}
beans.values().forEach(point -> doRegister((ExtensionPoint) point));
log.info("业务场景相关扩展点注册完成,注册数量: {}", registerExtensionBeans.size());
}
@Override
public <T extends ExtensionPoint> T get(BusinessScenario businessScenario, Class<T> clazz) {
final ExtensionDefinition definition = registerExtensionBeans.get(businessScenario.getUniqueIdentity());
if(definition == null) {
log.error("获取业务场景扩展点实现失败,失败原因:尚未定义该业务场景相关扩展点。{}", businessScenario);
throw new RuntimeException("尚未定义该业务场景相关扩展点 [" + businessScenario + "]");
}
return (T) definition.getExtensionPoint();
}
/**
* 注册扩展点
* @param point
*/
private void doRegister(@NotNull ExtensionPoint point) {
Class<?> extensionClazz = point.getClass();
if (AopUtils.isAopProxy(point)) {
extensionClazz = ClassUtils.getUserClass(point);
}
Extension extension = AnnotationUtils.findAnnotation(extensionClazz, Extension.class);
final BusinessScenario businessScenario = BusinessScenario.valueOf(extension.businessId(), extension.useCase(), extension.scenario());
final ExtensionDefinition definition = ExtensionDefinition.valueOf(businessScenario, point);
final ExtensionDefinition exist = registerExtensionBeans.get(businessScenario.getUniqueIdentity());
if(exist != null && !exist.equals(definition)) {
throw new RuntimeException("相同的业务场景重复注册了不同类型的扩展点实现 :【" + definition + "】【" + exist + "");
}
registerExtensionBeans.put(businessScenario.getUniqueIdentity(), definition);
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.yudao.framework.extension.core.stereotype;
import cn.iocoder.yudao.framework.extension.core.BusinessScenario;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
/**
* @description 表示带注释的类是“扩展组件”
* @author Qingchen
* @version 1.0.0
* @date 2021-08-28 21:59
* @class cn.iocoder.yudao.framework.extension.core.stereotype.Extension.java
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Component
public @interface Extension {
/**
* 业务 <br/>
* 一个自负盈亏的财务主体比如tmall、淘宝和零售通就是三个不同的业务
* @return
*/
String businessId() default BusinessScenario.DEFAULT_BUSINESS_ID;
/**
* 用例 <br/>
* 描述了用户和系统之间的互动,每个用例提供了一个或多个场景。比如,支付订单就是一个典型的用例。
* @return
*/
String useCase() default BusinessScenario.DEFAULT_USECASE;
/**
* 场景 <br/>
* 场景也被称为用例的实例Instance包括用例所有的可能情况正常的和异常的。比如对于"订单支付"这个用例,就有“支付宝支付”、“银行卡支付”、"微信支付"等多个场景
* @return
*/
String scenario() default BusinessScenario.DEFAULT_SCENARIO;
}