in dubbo-api-docs/dubbo-api-docs-core/src/main/java/org/apache/dubbo/apidocs/core/DubboApiDocsAnnotationScanner.java [100:166]
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
// Register dubbo doc provider
IDubboDocProvider dubboDocProvider = applicationContext.getBean(IDubboDocProvider.class);
exportDubboService(IDubboDocProvider.class, dubboDocProvider, false);
LOG.info("================= Dubbo API Docs--Start scanning and processing doc annotations ================");
Map<String, Object> apiModules = applicationContext.getBeansWithAnnotation(ApiModule.class);
apiModules.forEach((key, apiModuleTemp) -> {
Class<?> apiModuleClass;
if (AopUtils.isAopProxy(apiModuleTemp)) {
apiModuleClass = AopUtils.getTargetClass(apiModuleTemp);
} else {
apiModuleClass = apiModuleTemp.getClass();
}
ApiModule moduleAnn = apiModuleClass.getAnnotation(ApiModule.class);
if (!apiModuleClass.isAnnotationPresent(Service.class) && !apiModuleClass.isAnnotationPresent(DubboService.class)) {
LOG.warn("【Warning】" + apiModuleClass.getName() + " @ApiModule annotation is used, " +
"but it is not a dubbo provider (without " + Service.class.getName() + " or " +
DubboService.class.getName() + " annotation)");
return;
}
boolean async;
String apiVersion;
String apiGroup;
if (apiModuleClass.isAnnotationPresent(Service.class)) {
Service dubboService = apiModuleClass.getAnnotation(Service.class);
async = dubboService.async();
apiVersion = dubboService.version();
apiGroup = dubboService.group();
} else {
DubboService dubboService = apiModuleClass.getAnnotation(DubboService.class);
async = dubboService.async();
apiVersion = dubboService.version();
apiGroup = dubboService.group();
}
// API version&group safe guard!
String version = getSupplierValueIfAbsent(apiVersion, () -> ofNullable(providerConfig).map(ProviderConfig::getVersion).orElse(""));
String group = getSupplierValueIfAbsent(apiGroup, () -> ofNullable(providerConfig).map(ProviderConfig::getGroup).orElse(""));
apiVersion = applicationContext.getEnvironment().resolvePlaceholders(version);
apiGroup = applicationContext.getEnvironment().resolvePlaceholders(group);
ModuleCacheItem moduleCacheItem = new ModuleCacheItem();
DubboApiDocsCache.addApiModule(moduleAnn.apiInterface().getCanonicalName(), moduleCacheItem);
//module name
moduleCacheItem.setModuleDocName(moduleAnn.value());
//interface name containing package path
moduleCacheItem.setModuleClassName(moduleAnn.apiInterface().getCanonicalName());
//module version
moduleCacheItem.setModuleVersion(apiVersion);
//module group
moduleCacheItem.setModuleGroup(apiGroup);
Method[] apiModuleMethods = apiModuleClass.getMethods();
// API basic information list in module cache
List<ApiCacheItem> moduleApiList = new ArrayList<>(apiModuleMethods.length);
moduleCacheItem.setModuleApiList(moduleApiList);
for (Method method : apiModuleMethods) {
if (method.isAnnotationPresent(ApiDoc.class)) {
processApiDocAnnotation(method, moduleApiList, moduleAnn, async, moduleCacheItem, apiVersion, apiGroup);
}
}
});
LOG.info("================= Dubbo API Docs-- doc annotations scanning and processing completed ================");
}