This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/main by this push:
     new 87de70f67 OWB-1457 - [perf] Reuse generics “visited” map in 
InjectionResolver#implResolveByType
87de70f67 is described below

commit 87de70f673ccd9d9cc086e8b6a9042380b6ed013
Author: tandraschko <[email protected]>
AuthorDate: Tue Apr 14 16:11:37 2026 +0200

    OWB-1457 - [perf] Reuse generics “visited” map in 
InjectionResolver#implResolveByType
---
 .../webbeans/container/InjectionResolver.java      | 35 ++++++++++++++++------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git 
a/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
 
b/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
index 8d2f8a55e..ad94da21b 100644
--- 
a/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
+++ 
b/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
@@ -421,6 +421,7 @@ public class InjectionResolver
         }
 
         resolvedComponents = new HashSet<>();
+        HashMap<Type, Integer> visitedForGenerics = new HashMap<>();
 
         boolean returnAll = injectionPointType.equals(Object.class) && 
currentQualifier;
 
@@ -455,10 +456,10 @@ public class InjectionResolver
                 {
                     for (Type componentApiType : component.getTypes())
                     {
-
+                        visitedForGenerics.clear();
                         if (GenericsUtil.satisfiesDependency(
                                 isDelegate, 
AbstractProducerBean.class.isInstance(component),
-                                injectionPointType, componentApiType, new 
HashMap<>()))
+                                injectionPointType, componentApiType, 
visitedForGenerics))
                         {
                             resolvedComponents.add(component);
                             break;
@@ -470,14 +471,17 @@ public class InjectionResolver
 
         if (!returnAll)
         {
+            // Main scan may have left state in visitedForGenerics; refinement 
uses the same map.
+            visitedForGenerics.clear();
+
             // Look for qualifiers
             resolvedComponents = findByQualifier(resolvedComponents, 
injectionPointType, qualifiers);
 
             // have an additional round of checks for assignability of 
parameterized types.
-            Set<Bean<?>> byParameterizedType = 
findByParameterizedType(resolvedComponents, injectionPointType, isDelegate);
+            Set<Bean<?>> byParameterizedType = 
findByParameterizedType(resolvedComponents, injectionPointType, isDelegate, 
visitedForGenerics);
             if (byParameterizedType.isEmpty())
             {
-                resolvedComponents = findByBeanType(resolvedComponents, 
injectionPointType, isDelegate);
+                resolvedComponents = findByBeanType(resolvedComponents, 
injectionPointType, isDelegate, visitedForGenerics);
             }
             else
             {
@@ -509,7 +513,11 @@ public class InjectionResolver
         return resolvedComponents;
     }
 
-    private Set<Bean<?>> findByBeanType(Set<Bean<?>> allComponents, Type 
injectionPointType, boolean isDelegate)
+    /**
+     * @param visited scratch map for {@link 
GenericsUtil#satisfiesDependency}; cleared before each call.
+     */
+    private Set<Bean<?>> findByBeanType(Set<Bean<?>> allComponents, Type 
injectionPointType, boolean isDelegate,
+                                        Map<Type, Integer> visited)
     {
         if (allComponents == null || allComponents.isEmpty())
         {
@@ -517,13 +525,16 @@ public class InjectionResolver
             return allComponents;
         }
 
+        visited.clear();
+
         Set<Bean<?>> resolved = new HashSet<>();
         for (Bean<?> bean : allComponents)
         {
             boolean isProducer = AbstractProducerBean.class.isInstance(bean);
             for (Type type : bean.getTypes())
             {
-                if (GenericsUtil.satisfiesDependency(isDelegate, isProducer, 
injectionPointType, type, new HashMap<>()))
+                visited.clear();
+                if (GenericsUtil.satisfiesDependency(isDelegate, isProducer, 
injectionPointType, type, visited))
                 {
                     resolved.add(bean);
                 }
@@ -538,18 +549,24 @@ public class InjectionResolver
         return resolved;
     }
 
-    private Set<Bean<?>> findByParameterizedType(Set<Bean<?>> allComponents, 
Type injectionPointType, boolean isDelegate)
+    /**
+     * @param visited scratch map for {@link 
GenericsUtil#satisfiesDependency}; cleared before each call.
+     */
+    private Set<Bean<?>> findByParameterizedType(Set<Bean<?>> allComponents, 
Type injectionPointType, boolean isDelegate,
+                                                 Map<Type, Integer> visited)
     {
         Bean<?> rawProducerBean = null;
 
+        visited.clear();
+
         Set<Bean<?>> resolvedComponents = new HashSet<>();
         for (Bean<?> component : allComponents)
         {
             boolean isProducer = 
AbstractProducerBean.class.isInstance(component);
             for (Type componentApiType : component.getTypes())
             {
-
-                if (GenericsUtil.satisfiesDependency(isDelegate, isProducer, 
injectionPointType, componentApiType, new HashMap<>()))
+                visited.clear();
+                if (GenericsUtil.satisfiesDependency(isDelegate, isProducer, 
injectionPointType, componentApiType, visited))
                 {
                     resolvedComponents.add(component);
                     break;

Reply via email to