Skip to content

Commit ac02ee3

Browse files
authored
Make isBeanAbsent not count secondary beans (#953)
Secondary beans should not be wired under any circumstance if there are alternatives
1 parent e79ddeb commit ac02ee3

File tree

5 files changed

+28
-32
lines changed

5 files changed

+28
-32
lines changed

inject/src/main/java/io/avaje/inject/spi/DBeanMap.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,13 @@ void register(Provider<?> provider) {
102102
}
103103
}
104104

105-
/**
106-
* Get with a strict match on name for the single entry case.
107-
*/
108-
Object getStrict(Type type, String name) {
105+
/** Check if a non secondary entry exists */
106+
Object nonDefaultEntry(Type type, String name) {
109107
DContextEntry entry = beans.get(type.getTypeName());
110108
if (entry == null) {
111109
return null;
112110
}
113-
return entry.getStrict(name);
111+
return entry.nonDefaultEntry(name);
114112
}
115113

116114
boolean contains(String type) {
@@ -175,7 +173,8 @@ Map<String, Object> map(Type type, BeanScope parent) {
175173
Map<String, Object> localMap = map(type);
176174
if (parentMap.isEmpty()) {
177175
return localMap;
178-
} else if (localMap.isEmpty()) {
176+
}
177+
if (localMap.isEmpty()) {
179178
return parentMap;
180179
}
181180
Map<String, Object> result = new LinkedHashMap<>(parentMap);

inject/src/main/java/io/avaje/inject/spi/DBeanScope.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,20 +111,18 @@ private <T> T getByType(Type type, @Nullable String name) {
111111
return parent.get(type, name);
112112
}
113113

114-
/**
115-
* Get with a strict match on name for the single entry case.
116-
*/
114+
/** Check if a non secondary entry exists */
117115
@Nullable
118-
Object getStrict(@Nullable String name, Type[] types) {
116+
Object nonDefaultEntry(@Nullable String name, Type[] types) {
119117
for (Type type : types) {
120-
Object match = beans.getStrict(type, name);
118+
var match = beans.nonDefaultEntry(type, name);
121119
if (match != null) {
122120
return match;
123121
}
124122
}
125123
if (parent instanceof DBeanScope) {
126124
DBeanScope dParent = (DBeanScope) parent;
127-
return dParent.getStrict(name, types);
125+
return dParent.nonDefaultEntry(name, types);
128126
}
129127
return null;
130128
}
@@ -183,12 +181,12 @@ private <T> List<T> listOf(Type type, @Nullable String name) {
183181
static <T> List<T> combine(List<T> values, List<T> parentValues) {
184182
if (values.isEmpty()) {
185183
return parentValues;
186-
} else if (parentValues.isEmpty()) {
187-
return values;
188-
} else {
189-
values.addAll(parentValues);
184+
}
185+
if (parentValues.isEmpty()) {
190186
return values;
191187
}
188+
values.addAll(parentValues);
189+
return values;
192190
}
193191

194192
@Override
@@ -266,8 +264,7 @@ private void shutdown() {
266264
@Override
267265
public Set<String> customScopeAnnotations() {
268266
if (parent != null) {
269-
final Set<String> scopes = new HashSet<>();
270-
scopes.addAll(beans.scopeAnnotations());
267+
final Set<String> scopes = new HashSet<>(beans.scopeAnnotations());
271268
scopes.addAll(parent.customScopeAnnotations());
272269
return scopes;
273270
}

inject/src/main/java/io/avaje/inject/spi/DBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ public boolean isBeanAbsent(@Nullable String name, Type... types) {
7777
return true;
7878
}
7979
if (parent instanceof DBeanScope) {
80-
// effectively looking for a match in the parent scope
80+
// look for a match in the parent scope
8181
final DBeanScope dParent = (DBeanScope) parent;
82-
parentMatch = dParent.getStrict(name, removeAnnotations(types));
82+
parentMatch = dParent.nonDefaultEntry(name, removeAnnotations(types));
8383
return parentMatch == null;
8484
}
8585
return true;

inject/src/main/java/io/avaje/inject/spi/DContextEntry.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@ Provider<?> provider(String name, Class<? extends AvajeModule> currentModule) {
3838
return new EntryMatcher(name, currentModule).provider(entries);
3939
}
4040

41-
/**
42-
* Get with strict name match for the single entry case.
43-
*/
44-
Object getStrict(String name) {
41+
/** Check if a non secondary entry exists */
42+
Object nonDefaultEntry(String name) {
4543
if (entries.size() == 1) {
46-
return entries.get(0).beanIfNameMatch(name);
44+
return entries.get(0).nonDefaultMatch(name);
4745
}
48-
return new EntryMatcher(name, null).match(entries);
46+
var entry = new EntryMatcher(name, null).findMatch(entries);
47+
return entry != null ? entry.nonDefaultMatch(null) : null;
4948
}
5049

5150
Object get(String name, Class<? extends AvajeModule> currentModule) {
@@ -156,7 +155,8 @@ private void checkMatch(DContextEntryBean entry) {
156155
if (match.priority() < entry.priority()) {
157156
// existing supplied match always wins
158157
return;
159-
} else if (match.priority() > entry.priority()) {
158+
}
159+
if (match.priority() > entry.priority()) {
160160
// new supplied wins
161161
match = entry;
162162
return;
@@ -171,13 +171,9 @@ private void checkMatch(DContextEntryBean entry) {
171171
}
172172
// leave as is, current primary wins
173173
return;
174-
} else if (impliedName) {
175-
ignoredSecondaryMatch = entry;
176-
return;
177174
}
178-
179175
// try to resolve match using qualifier name (including null)
180-
if (match.isNameEqual(name) && !entry.isNameEqual(name)) {
176+
if (impliedName || (match.isNameEqual(name) && !entry.isNameEqual(name))) {
181177
ignoredSecondaryMatch = entry;
182178
return;
183179
} else if (!match.isNameEqual(name) && entry.isNameEqual(name)) {

inject/src/main/java/io/avaje/inject/spi/DContextEntryBean.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ final boolean isSupplied(String qualifierName) {
109109
return priority == BeanEntry.SUPPLIED && (qualifierName == null || qualifierName.equals(name));
110110
}
111111

112+
final Object nonDefaultMatch(String name) {
113+
return isNameMatch(name) && priority != BeanEntry.SECONDARY ? bean() : null;
114+
}
115+
112116
/**
113117
* Prototype scope Provider based entry.
114118
*/

0 commit comments

Comments
 (0)