Browse Source

Provide default ParameterNameDiscoverer for AACBF

Prior to this change, AbstractAutowireCapableBeanFactory did not support
a default ParameterNameDiscoverer.  This meant that attempting to use
<constructor-arg name=".."> syntax would fail (with a fairly obscure
exception) as that feature depends on a ParameterNameDiscoverer to
introspect the constructor arguments.

This lack of a default was originally intended to avoid a dependency on
ASM, but now that (a) .asm is a built-in module and (b) .beans has a
non-optional compile-time dependency on .asm, there is no reason not to
provide this default.

The net effect is that in a number of locations throughout the
framework, namely in GenericApplicationContext and
AbstractRefreshableApplicationContext, it is no longer necessary to
explicitly call AACBF#setParameterNameDiscoverer. This also means that
using a naked BeanFactory (likely for testing scenarios) is that much
easier.

Issue: SPR-8184

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4568 50f2f4bb-b051-0410-bef5-90022cba6387
pull/1/merge
Chris Beams 15 years ago
parent
commit
b68f4d984a
  1. 7
      org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
  2. 1
      org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
  3. 1
      org.springframework.beans/src/test/java/org/springframework/beans/factory/xml/FactoryMethodTests.java
  4. 2
      org.springframework.beans/src/test/java/org/springframework/beans/factory/xml/SimpleConstructorNamespaceHandlerTests.java
  5. 1
      org.springframework.context/src/main/java/org/springframework/context/support/AbstractRefreshableApplicationContext.java
  6. 1
      org.springframework.context/src/main/java/org/springframework/context/support/GenericApplicationContext.java

7
org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java

@ -68,6 +68,7 @@ import org.springframework.beans.factory.config.DependencyDescriptor; @@ -68,6 +68,7 @@ import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.core.PriorityOrdered;
@ -116,7 +117,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac @@ -116,7 +117,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
/** Resolver strategy for method parameter names */
private ParameterNameDiscoverer parameterNameDiscoverer;
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
/** Whether to automatically try to resolve circular references between beans */
private boolean allowCircularReferences = true;
@ -186,9 +187,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac @@ -186,9 +187,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
/**
* Set the ParameterNameDiscoverer to use for resolving method parameter
* names if needed (e.g. for constructor names).
* <p>Default is none. A typical candidate is
* {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer},
* which implies an ASM dependency and hence isn't set as the default.
* <p>The default is {@link LocalVariableTableParameterNameDiscoverer}.
*/
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
this.parameterNameDiscoverer = parameterNameDiscoverer;

1
org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

@ -1350,7 +1350,6 @@ public class DefaultListableBeanFactoryTests { @@ -1350,7 +1350,6 @@ public class DefaultListableBeanFactoryTests {
@Test
public void testAutowireBeanByTypeWithTwoMatchesAndParameterNameDiscovery() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("test", bd);

1
org.springframework.beans/src/test/java/org/springframework/beans/factory/xml/FactoryMethodTests.java

@ -107,7 +107,6 @@ public class FactoryMethodTests { @@ -107,7 +107,6 @@ public class FactoryMethodTests {
@Test
public void testFactoryMethodsWithNullValue() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
xbf.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));

2
org.springframework.beans/src/test/java/org/springframework/beans/factory/xml/SimpleConstructorNamespaceHandlerTests.java

@ -103,7 +103,7 @@ public class SimpleConstructorNamespaceHandlerTests { @@ -103,7 +103,7 @@ public class SimpleConstructorNamespaceHandlerTests {
private XmlBeanFactory createFactory(String resourceName) {
XmlBeanFactory fact = new XmlBeanFactory(new ClassPathResource(resourceName, getClass()));
fact.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
//fact.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
return fact;
}
}

1
org.springframework.context/src/main/java/org/springframework/context/support/AbstractRefreshableApplicationContext.java

@ -216,7 +216,6 @@ public abstract class AbstractRefreshableApplicationContext extends AbstractAppl @@ -216,7 +216,6 @@ public abstract class AbstractRefreshableApplicationContext extends AbstractAppl
if (this.allowCircularReferences != null) {
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
}
beanFactory.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
}

1
org.springframework.context/src/main/java/org/springframework/context/support/GenericApplicationContext.java

@ -101,7 +101,6 @@ public class GenericApplicationContext extends AbstractApplicationContext implem @@ -101,7 +101,6 @@ public class GenericApplicationContext extends AbstractApplicationContext implem
*/
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
this.beanFactory.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
this.beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
}

Loading…
Cancel
Save