Lookup method definitions can be overridden in child beans

Issue: SPR-13388
master
Juergen Hoeller 9 years ago
parent b198cad58e
commit 74e6213baf
  1. 15
      spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java
  2. 12
      spring-beans/src/test/java/org/springframework/beans/factory/support/LookupMethodTests.java
  3. 8
      spring-beans/src/test/resources/org/springframework/beans/factory/support/lookupMethodTests.xml

@ -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) {

@ -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 {

@ -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>

Loading…
Cancel
Save