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
This commit is contained in:
parent
8cb5c36512
commit
4fc386a4f5
|
|
@ -68,6 +68,7 @@ import org.springframework.beans.factory.config.DependencyDescriptor;
|
||||||
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
|
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
|
||||||
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
|
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
|
||||||
import org.springframework.beans.factory.config.TypedStringValue;
|
import org.springframework.beans.factory.config.TypedStringValue;
|
||||||
|
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.PriorityOrdered;
|
import org.springframework.core.PriorityOrdered;
|
||||||
|
|
@ -116,7 +117,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
|
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
|
||||||
|
|
||||||
/** Resolver strategy for method parameter names */
|
/** Resolver strategy for method parameter names */
|
||||||
private ParameterNameDiscoverer parameterNameDiscoverer;
|
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
||||||
|
|
||||||
/** Whether to automatically try to resolve circular references between beans */
|
/** Whether to automatically try to resolve circular references between beans */
|
||||||
private boolean allowCircularReferences = true;
|
private boolean allowCircularReferences = true;
|
||||||
|
|
@ -186,9 +187,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
||||||
* names if needed (e.g. for constructor names).
|
* names if needed (e.g. for constructor names).
|
||||||
* <p>Default is none. A typical candidate is
|
* <p>The default is {@link LocalVariableTableParameterNameDiscoverer}.
|
||||||
* {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer},
|
|
||||||
* which implies an ASM dependency and hence isn't set as the default.
|
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
||||||
|
|
@ -1350,7 +1350,6 @@ public class DefaultListableBeanFactoryTests {
|
||||||
@Test
|
@Test
|
||||||
public void testAutowireBeanByTypeWithTwoMatchesAndParameterNameDiscovery() {
|
public void testAutowireBeanByTypeWithTwoMatchesAndParameterNameDiscovery() {
|
||||||
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
|
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
|
||||||
lbf.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
|
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
|
||||||
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
|
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
|
||||||
lbf.registerBeanDefinition("test", bd);
|
lbf.registerBeanDefinition("test", bd);
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,6 @@ public class FactoryMethodTests {
|
||||||
@Test
|
@Test
|
||||||
public void testFactoryMethodsWithNullValue() {
|
public void testFactoryMethodsWithNullValue() {
|
||||||
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
|
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
|
||||||
xbf.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
|
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
|
||||||
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
|
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ public class SimpleConstructorNamespaceHandlerTests {
|
||||||
|
|
||||||
private XmlBeanFactory createFactory(String resourceName) {
|
private XmlBeanFactory createFactory(String resourceName) {
|
||||||
XmlBeanFactory fact = new XmlBeanFactory(new ClassPathResource(resourceName, getClass()));
|
XmlBeanFactory fact = new XmlBeanFactory(new ClassPathResource(resourceName, getClass()));
|
||||||
fact.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
//fact.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
||||||
return fact;
|
return fact;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -216,7 +216,6 @@ public abstract class AbstractRefreshableApplicationContext extends AbstractAppl
|
||||||
if (this.allowCircularReferences != null) {
|
if (this.allowCircularReferences != null) {
|
||||||
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
|
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
|
||||||
}
|
}
|
||||||
beanFactory.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
|
beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,6 @@ public class GenericApplicationContext extends AbstractApplicationContext implem
|
||||||
*/
|
*/
|
||||||
public GenericApplicationContext() {
|
public GenericApplicationContext() {
|
||||||
this.beanFactory = new DefaultListableBeanFactory();
|
this.beanFactory = new DefaultListableBeanFactory();
|
||||||
this.beanFactory.setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
this.beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
|
this.beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue