From ab4d0069555774c433f15df73f9035f06e858837 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Thu, 30 May 2024 11:09:06 +0200 Subject: [PATCH] Fixed some di problems. --- .../di/AbstractInjectingObjectFactory.java | 14 ++++++- .../di/DefaultRegistryObjectFactoryTests.java | 37 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/util/di/src/main/java/groowt/util/di/AbstractInjectingObjectFactory.java b/util/di/src/main/java/groowt/util/di/AbstractInjectingObjectFactory.java index afae93a..8d566db 100644 --- a/util/di/src/main/java/groowt/util/di/AbstractInjectingObjectFactory.java +++ b/util/di/src/main/java/groowt/util/di/AbstractInjectingObjectFactory.java @@ -166,6 +166,18 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory { return null; } + private static boolean areArgsAssignable(Class[] paramTypes, Object[] givenArgs) { + if (paramTypes.length != givenArgs.length) { + return false; + } + for (int i = 0; i < paramTypes.length; i++) { + if (!paramTypes[i].isInstance(givenArgs[i])) { + return false; + } + } + return true; + } + /** * @implNote If overridden, please cache any found non-inject constructors using * {@link #putCachedNonInjectConstructor}. @@ -187,7 +199,7 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory { final Constructor[] constructors = this.cachedAllConstructors.computeIfAbsent(clazz, Class::getConstructors); for (Constructor constructor : constructors) { - if (Arrays.equals(constructor.getParameterTypes(), types)) { + if (areArgsAssignable(constructor.getParameterTypes(), constructorArgs)) { final Constructor found = (Constructor) constructor; this.putCachedNonInjectConstructor(new CachedNonInjectConstructor<>(clazz, found, types)); return found; diff --git a/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java b/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java index 1ecfc9e..d733ada 100644 --- a/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java +++ b/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java @@ -213,4 +213,41 @@ public class DefaultRegistryObjectFactoryTests { assertEquals("HELLO, WORLD!", g.greet()); } + public static final class NoInjectGreeter implements Greeter { + + private final String greeting; + + public NoInjectGreeter(String greeting) { + this.greeting = greeting; + } + + @Override + public String greet() { + return this.greeting; + } + + } + + @Test + public void noInjectFoundViaGet() { + final var b = DefaultRegistryObjectFactory.Builder.withDefaults(); + b.configureRegistry(r -> { + r.bind(NoInjectGreeter.class, toSelf()); + }); + final var f = b.build(); + final var g = f.get(NoInjectGreeter.class, "Given Greeting"); + assertEquals("Given Greeting", g.greet()); + } + + @Test + public void noInjectFindViaCreate() { + final var b = DefaultRegistryObjectFactory.Builder.withDefaults(); + b.configureRegistry(r -> { + r.bind(NoInjectGreeter.class, toSelf()); + }); + final var f = b.build(); + final var g = f.createInstance(NoInjectGreeter.class, "Given Greeting"); + assertEquals("Given Greeting", g.greet()); + } + }