[picocontainer-scm] [scm-git][4] Update to Pico 2 svn bugfix version 5799
Michael Rimov <git-yCVjj/[email protected]> Fri, 29 Jun 2012 12:26:13 -0500 (CDT)
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit f430a4e69b24a2bbfd09c3d1a10888346094ef83 Author: Michael Rimov <[email protected]> AuthorDate: Mon Jun 25 06:41:39 2012 -0700 Commit: Michael Rimov <[email protected]> CommitDate: Mon Jun 25 06:41:39 2012 -0700 Update to Pico 2 svn bugfix version 5799 diff --git a/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java b/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java index b353f6f..014ddbe 100644 --- a/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java +++ b/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java @@ -34,6 +34,7 @@ import java.lang.annotation.Annotation; import static org.picocontainer.injectors.AnnotatedMethodInjection.getInjectionAnnotation; import static org.picocontainer.injectors.AnnotatedMethodInjection.AnnotatedMethodInjector.makeAnnotationNames; + /** * A {@link org.picocontainer.InjectionType} for Guice-style annotated fields. * The factory creates {@link AnnotatedFieldInjector}. diff --git a/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java b/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java index 6e3e5d5..8585ace 100644 --- a/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java +++ b/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java @@ -40,7 +40,7 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> { protected transient Annotation[] bindings; private transient Paranamer paranamer; - + private transient boolean initialized; /** * Constructs a IterativeInjector * @@ -78,9 +78,9 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> { } private Parameter[] getMatchingParameterListForSetters(PicoContainer container) throws PicoCompositionException { - if (injectionMembers == null) { + if (initialized == false) { synchronized(this) { - if (injectionMembers == null) { + if (initialized == false) { initializeInjectionMembersAndTypeLists(); } } @@ -258,6 +258,7 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> { protected void initializeInjectionMembersAndTypeLists() { injectionMembers = new ArrayList<AccessibleObject>(); + Set<String> injectionMemberNames = new HashSet<String>(); List<Annotation> bingingIds = new ArrayList<Annotation>(); final List<String> nameList = new ArrayList<String>(); final List<Type> typeList = new ArrayList<Type>(); @@ -266,11 +267,16 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> { final Type[] parameterTypes = method.getGenericParameterTypes(); fixGenericParameterTypes(method, parameterTypes); + String methodSignature = crudeMethodSignature(method); + // We're only interested if there is only one parameter and the method name is bean-style. if (parameterTypes.length == 1) { boolean isInjector = isInjectorMethod(method); - if (isInjector) { + // ... and the method name is bean-style. + // We're also not interested in dupes from parent classes (not all JDK impls) + if (isInjector && !injectionMemberNames.contains(methodSignature)) { injectionMembers.add(method); + injectionMemberNames.add(methodSignature); nameList.add(getName(method)); typeList.add(box(parameterTypes[0])); bingingIds.add(getBindings(method, 0)); @@ -279,8 +285,20 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> { } injectionTypes = typeList.toArray(new Type[0]); bindings = bingingIds.toArray(new Annotation[0]); + initialized = true; + } + + public static String crudeMethodSignature(Method method) { + StringBuilder sb = new StringBuilder(); + sb.append(method.getReturnType().getName()); + sb.append(method.getName()); + for (Class<?> pType : method.getParameterTypes()) { + sb.append(pType.getName()); + } + return sb.toString(); } + protected String getName(Method method) { return null; } diff --git a/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java b/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java index dcfb1dd..ed9cd8e 100644 --- a/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java +++ b/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java @@ -25,7 +25,7 @@ public class TypedFieldInjectorTestCase { public static class PogoStick { } - @Test public void testFieldInjectionByType() { + @Test public void testFieldInjectionByTypeWhereMatch() { MutablePicoContainer pico = new DefaultPicoContainer(); pico.addAdapter(new TypedFieldInjection.TypedFieldInjector(Helicopter.class, Helicopter.class, new NullComponentMonitor(), Integer.class.getName() + " " + PogoStick.class.getName() + " " + Float.class.getName(), null )); @@ -36,4 +36,5 @@ public class TypedFieldInjectorTestCase { } + } \ No newline at end of file