diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
index 58bba15a4f0a..e14203a50d14 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
@@ -170,7 +170,7 @@ public interface BeanFactory {
* overriding the specified default arguments (if any) in the bean definition.
* @param name the name of the bean to retrieve
* @param args arguments to use if creating a prototype using explicit arguments to a
- * static factory method. It is invalid to use a non-null args value in any other case.
+ * static factory method.
* @return an instance of the bean
* @throws NoSuchBeanDefinitionException if there's no such bean definition
* @throws BeanDefinitionStoreException if arguments have been given but
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
index c174976a39b7..c6372de35dbd 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
@@ -157,7 +157,7 @@ private class LookupOverrideMethodInterceptor extends CglibIdentitySupport imple
public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) throws Throwable {
// Cast is safe, as CallbackFilter filters are used selectively.
LookupOverride lo = (LookupOverride) beanDefinition.getMethodOverrides().getOverride(method);
- return owner.getBean(lo.getBeanName());
+ return owner.getBean(lo.getBeanName(), args);
}
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java
index 2a34093cf6ae..e165a5479ca0 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java
@@ -61,7 +61,7 @@ public String getBeanName() {
*/
@Override
public boolean matches(Method method) {
- return (method.getName().equals(getMethodName()) && method.getParameterTypes().length == 0);
+ return (method.getName().equals(getMethodName()));
}
diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/LookupMethodTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/LookupMethodTests.java
new file mode 100644
index 000000000000..bbfde74d9754
--- /dev/null
+++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/LookupMethodTests.java
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.beans.factory.support;
+
+import junit.framework.TestCase;
+
+import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.core.io.ClassPathResource;
+
+import test.beans.AbstractBean;
+import test.beans.TestBean;
+
+/**
+ * Tests the use of lookup-method
+ * @author Karl Pietrzak
+ */
+public class LookupMethodTests extends TestCase {
+
+
+ private DefaultListableBeanFactory beanFactory;
+
+ protected void setUp() throws Exception {
+ final ClassPathResource resource = new ClassPathResource("/org/springframework/beans/factory/xml/lookupMethodBeanTests.xml", getClass());
+ this.beanFactory = new DefaultListableBeanFactory();
+ final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this.beanFactory);
+ reader.loadBeanDefinitions(resource);
+ }
+
+ /**
+ * lookup method's bean has no constructor arguments
+ */
+ public void testWithoutConstructorArg() {
+ AbstractBean bean = (AbstractBean)this.beanFactory.getBean("abstractBean");
+ assertNotNull(bean);
+ final Object expected = bean.get();
+ assertEquals(TestBean.class, expected.getClass());
+ }
+
+ /**
+ * Creates a new instance of {@link TestBean} using the constructor which takes a single String
+ */
+ public void testWithOneConstructorArg() {
+ AbstractBean bean = (AbstractBean)this.beanFactory.getBean("abstractBean");
+ assertNotNull(bean);
+ final TestBean expected = bean.getOneArgument("haha");
+ assertEquals(TestBean.class, expected.getClass());
+ assertEquals("haha", expected.getName());
+ }
+
+ /**
+ * Creates a new instance of {@link TestBean} using the constructor which takes a String
and an int
+ */
+ public void testWithTwoConstructorArg() {
+ AbstractBean bean = (AbstractBean)this.beanFactory.getBean("abstractBean");
+ assertNotNull(bean);
+ final TestBean expected = bean.getTwoArguments("haha", 72);
+ assertEquals(TestBean.class, expected.getClass());
+ assertEquals("haha", expected.getName());
+ assertEquals(72, expected.getAge());
+ }
+
+ /**
+ * {@link TestBean} doesn't have a constructor that takes a String
and two int
's
+ */
+ public void testWithThreeArgsShouldFail() {
+ AbstractBean bean = (AbstractBean)this.beanFactory.getBean("abstractBean");
+ assertNotNull(bean);
+ try {
+ bean.getThreeArguments("name", 1, 2);
+ fail("TestBean does not have a three arg constructor so this should not have worked");
+ } catch (AbstractMethodError e) {
+
+ }
+ }
+}
diff --git a/spring-beans/src/test/java/test/beans/AbstractBean.java b/spring-beans/src/test/java/test/beans/AbstractBean.java
new file mode 100644
index 000000000000..c6dfea1e0286
--- /dev/null
+++ b/spring-beans/src/test/java/test/beans/AbstractBean.java
@@ -0,0 +1,19 @@
+package test.beans;
+
+import org.springframework.beans.factory.support.LookupMethodTests;
+
+/**
+ * A simple bean used for testing lookup-method
constructors.
+ *
+ * The actual test class which uses this bean is {@link LookupMethodTests}
+ * @author kpietrzak
+ *
+ */
+public abstract class AbstractBean {
+
+ public abstract TestBean get();
+ public abstract TestBean getOneArgument(String name);
+ public abstract TestBean getTwoArguments(String name, int age);
+ public abstract TestBean getThreeArguments(String name, int age, int anotherArg);
+
+}
diff --git a/spring-beans/src/test/resources/org/springframework/beans/factory/xml/lookupMethodBeanTests.xml b/spring-beans/src/test/resources/org/springframework/beans/factory/xml/lookupMethodBeanTests.xml
new file mode 100644
index 000000000000..9d57bac011f2
--- /dev/null
+++ b/spring-beans/src/test/resources/org/springframework/beans/factory/xml/lookupMethodBeanTests.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+