diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java index 89b55da372e..60c2732aa9a 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Member; import java.lang.reflect.Method; -import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; @@ -83,7 +83,7 @@ public class InjectionMetadata { doRegisterConfigMembers(beanDefinition, this.injectedMethods); } - private void doRegisterConfigMembers(RootBeanDefinition beanDefinition, Set members) { + private void doRegisterConfigMembers(RootBeanDefinition beanDefinition, Collection members) { for (Iterator it = members.iterator(); it.hasNext();) { Member member = it.next().getMember(); if (!beanDefinition.isExternallyManagedConfigMember(member)) { @@ -231,15 +231,7 @@ public class InjectionMetadata { return false; } InjectedElement otherElement = (InjectedElement) other; - if (this.isField) { - return this.member.equals(otherElement.member); - } - else { - return (otherElement.member instanceof Method && - this.member.getName().equals(otherElement.member.getName()) && - Arrays.equals(((Method) this.member).getParameterTypes(), - ((Method) otherElement.member).getParameterTypes())); - } + return this.member.equals(otherElement.member); } @Override diff --git a/org.springframework.beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/org.springframework.beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index fba1691903b..6ab3a0b99cf 100644 --- a/org.springframework.beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/org.springframework.beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -146,6 +146,32 @@ public final class AutowiredAnnotationBeanPostProcessorTests { bf.destroySingletons(); } + @Test + public void testExtendedResourceInjectionWithSkippedOverriddenMethods() { + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + bf.registerResolvableDependency(BeanFactory.class, bf); + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); + bpp.setBeanFactory(bf); + bf.addBeanPostProcessor(bpp); + RootBeanDefinition annotatedBd = new RootBeanDefinition(OverriddenExtendedResourceInjectionBean.class); + bf.registerBeanDefinition("annotatedBean", annotatedBd); + TestBean tb = new TestBean(); + bf.registerSingleton("testBean", tb); + NestedTestBean ntb = new NestedTestBean(); + bf.registerSingleton("nestedTestBean", ntb); + + OverriddenExtendedResourceInjectionBean bean = (OverriddenExtendedResourceInjectionBean) bf.getBean("annotatedBean"); + assertSame(tb, bean.getTestBean()); + assertNull(bean.getTestBean2()); + assertSame(tb, bean.getTestBean3()); + assertSame(tb, bean.getTestBean4()); + assertSame(ntb, bean.getNestedTestBean()); + assertNull(bean.getBeanFactory()); + assertTrue(bean.baseInjected); + assertTrue(bean.subInjected); + bf.destroySingletons(); + } + @Test public void testExtendedResourceInjectionWithAtRequired() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); @@ -934,7 +960,9 @@ public final class AutowiredAnnotationBeanPostProcessorTests { private ITestBean testBean4; - private BeanFactory beanFactory; + protected BeanFactory beanFactory; + + public boolean baseInjected = false; public ExtendedResourceInjectionBean() { } @@ -950,6 +978,11 @@ public final class AutowiredAnnotationBeanPostProcessorTests { this.nestedTestBean = nestedTestBean; } + @Autowired + private void inject(ITestBean testBean4) { + this.baseInjected = true; + } + @Autowired protected void initBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; @@ -978,6 +1011,27 @@ public final class AutowiredAnnotationBeanPostProcessorTests { } + public static class OverriddenExtendedResourceInjectionBean extends ExtendedResourceInjectionBean { + + public boolean subInjected = false; + + @Override + public void setTestBean2(TestBean testBean2) { + super.setTestBean2(testBean2); + } + + @Override + protected void initBeanFactory(BeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + + @Autowired + private void inject(ITestBean testBean4) { + this.subInjected = true; + } + } + + public static class OptionalResourceInjectionBean extends ResourceInjectionBean { @Autowired(required = false) diff --git a/org.springframework.core/src/main/java/org/springframework/util/ClassUtils.java b/org.springframework.core/src/main/java/org/springframework/util/ClassUtils.java index be907f20c08..d0bea4da826 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/ClassUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/util/ClassUtils.java @@ -689,16 +689,18 @@ public abstract class ClassUtils { * targetClass doesn't implement it or is null */ public static Method getMostSpecificMethod(Method method, Class targetClass) { - if (method != null && targetClass != null && !targetClass.equals(method.getDeclaringClass())) { + Method result = method; + if (method != null && !Modifier.isPrivate(method.getModifiers()) && + targetClass != null && !targetClass.equals(method.getDeclaringClass())) { try { - method = targetClass.getMethod(method.getName(), method.getParameterTypes()); + result = targetClass.getDeclaredMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException ex) { // Perhaps the target class doesn't implement this method: // that's fine, just use the original method. } } - return method; + return result; } /**