From ad2c3cc97ae9478a02e1b5f792bf329d8c78c77a Mon Sep 17 00:00:00 2001
From: diguage <leejun119@gmail.com>
Date: Sat, 19 Oct 2024 10:57:20 +0800
Subject: [PATCH] extract packages from SpringBootApplication or ComponentScan
 if EnableFeignClients does not set basePackages or basePackageClasses

---
 .../openfeign/FeignClientsRegistrar.java      | 59 +++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java
index 00fe8f195..c4c1c098a 100644
--- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java
+++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java
@@ -410,6 +410,65 @@ protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata)
 			basePackages.add(ClassUtils.getPackageName(clazz));
 		}
 
+		if (basePackages.isEmpty()) {
+			// org.springframework.boot.autoconfigure.SpringBootApplication
+			String bootAppClassName = "org.springframework.boot.autoconfigure.SpringBootApplication";
+			if (importingClassMetadata.hasAnnotation(bootAppClassName)){
+				Map<String, Object> bootAttributes = importingClassMetadata
+					.getAnnotationAttributes(bootAppClassName);
+				for (String pkg : (String[]) bootAttributes.get("scanBasePackages")) {
+					if (StringUtils.hasText(pkg)) {
+						basePackages.add(pkg);
+					}
+				}
+				for (Class<?> clazz : (Class[]) bootAttributes.get("scanBasePackageClasses")) {
+					basePackages.add(ClassUtils.getPackageName(clazz));
+				}
+			}
+
+			String componentScanClassName = "org.springframework.context.annotation.ComponentScan";
+			if (importingClassMetadata.hasAnnotation(componentScanClassName)) {
+				Map<String, Object> scanAttributes = importingClassMetadata
+					.getAnnotationAttributes(componentScanClassName);
+				for (String pkg : (String[]) scanAttributes.get("value")) {
+					if (StringUtils.hasText(pkg)) {
+						basePackages.add(pkg);
+					}
+				}
+				for (String pkg : (String[]) scanAttributes.get("basePackages")) {
+					if (StringUtils.hasText(pkg)) {
+						basePackages.add(pkg);
+					}
+				}
+				for (Class<?> clazz : (Class[]) scanAttributes.get("basePackageClasses")) {
+					basePackages.add(ClassUtils.getPackageName(clazz));
+				}
+			}
+
+			String componentScansClassName = "org.springframework.context.annotation.ComponentScans";
+			if (importingClassMetadata.hasAnnotation(componentScansClassName)) {
+				Map<String, Object> componentScansAttrs =
+					importingClassMetadata.getAnnotationAttributes(componentScansClassName);
+				AnnotationAttributes[] componentScanAttributes =
+					(AnnotationAttributes[]) componentScansAttrs.get("value");
+				for (AnnotationAttributes scanAttributes : componentScanAttributes) {
+					for (String pkg : (String[]) scanAttributes.get("value")) {
+						if (StringUtils.hasText(pkg)) {
+							basePackages.add(pkg);
+						}
+					}
+					for (String pkg : (String[]) scanAttributes.get("basePackages")) {
+						if (StringUtils.hasText(pkg)) {
+							basePackages.add(pkg);
+						}
+					}
+					for (Class<?> clazz : (Class[]) scanAttributes.get("basePackageClasses")) {
+						basePackages.add(ClassUtils.getPackageName(clazz));
+					}
+				}
+			}
+		}
+
 		if (basePackages.isEmpty()) {
 			basePackages.add(ClassUtils.getPackageName(importingClassMetadata.getClassName()));
 		}