Lookup method definitions can be overridden in child beans

Issue: SPR-13388
This commit is contained in:
Juergen Hoeller 2015-08-25 17:08:49 +02:00
parent b198cad58e
commit 74e6213baf
3 changed files with 28 additions and 7 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2015 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.
@ -18,6 +18,7 @@ package org.springframework.beans.factory.support;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
/**
@ -34,7 +35,7 @@ import java.util.Set;
*/
public class MethodOverrides {
private final Set<MethodOverride> overrides = new HashSet<MethodOverride>(0);
private final Set<MethodOverride> overrides = new LinkedHashSet<MethodOverride>(0);
/**
@ -89,14 +90,16 @@ public class MethodOverrides {
* @return the method override, or {@code null} if none
*/
public MethodOverride getOverride(Method method) {
for (MethodOverride override : this.overrides) {
if (override.matches(method)) {
return override;
MethodOverride match = null;
for (MethodOverride candidate : this.overrides) {
if (candidate.matches(method)) {
match = candidate;
}
}
return null;
return match;
}
@Override
public boolean equals(Object other) {
if (this == other) {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@ -90,6 +90,16 @@ public class LookupMethodTests {
}
}
@Test
public void testWithOverriddenLookupMethod() {
AbstractBean bean = (AbstractBean) beanFactory.getBean("extendedBean");
assertNotNull(bean);
TestBean expected = bean.getOneArgument("haha");
assertEquals(TestBean.class, expected.getClass());
assertEquals("haha", expected.getName());
assertTrue(expected.isJedi());
}
public static abstract class AbstractBean {

View File

@ -9,6 +9,14 @@
<lookup-method name="getTwoArguments" bean="testBean"/>
</bean>
<bean id="extendedBean" parent="abstractBean">
<lookup-method name="getOneArgument" bean="jedi"/>
</bean>
<bean id="testBean" class="org.springframework.tests.sample.beans.TestBean" scope="prototype"/>
<bean id="jedi" class="org.springframework.tests.sample.beans.TestBean" scope="prototype" autowire-candidate="false">
<property name="jedi" value="true"/>
</bean>
</beans>