diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index 2585a913523..262a3b08be6 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * 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. @@ -102,7 +102,7 @@ class ConstructorResolver { * or null if none (-> use constructor argument values from bean definition) * @return a BeanWrapper for the new instance */ - protected BeanWrapper autowireConstructor( + public BeanWrapper autowireConstructor( String beanName, RootBeanDefinition mbd, Constructor[] chosenCtors, Object[] explicitArgs) { BeanWrapperImpl bw = new BeanWrapperImpl(); @@ -148,7 +148,7 @@ class ConstructorResolver { mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR); ConstructorArgumentValues resolvedValues = null; - int minNrOfArgs = 0; + int minNrOfArgs; if (explicitArgs != null) { minNrOfArgs = explicitArgs.length; } @@ -159,8 +159,18 @@ class ConstructorResolver { } // Take specified constructors, if any. - Constructor[] candidates = - (chosenCtors != null ? chosenCtors : mbd.getBeanClass().getDeclaredConstructors()); + Constructor[] candidates = chosenCtors; + if (candidates == null) { + Class beanClass = mbd.getBeanClass(); + try { + candidates = beanClass.getDeclaredConstructors(); + } + catch (Throwable ex) { + throw new BeanCreationException(mbd.getResourceDescription(), beanName, + "Resolution of declared constructors on bean Class [" + beanClass.getName() + + "] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex); + } + } AutowireUtils.sortConstructors(candidates); int minTypeDiffWeight = Integer.MAX_VALUE; @@ -180,7 +190,7 @@ class ConstructorResolver { "(hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)"); } - ArgumentsHolder args = null; + ArgumentsHolder args; List causes = null; if (resolvedValues != null) { @@ -270,9 +280,9 @@ class ConstructorResolver { BeanWrapperImpl bw = new BeanWrapperImpl(); this.beanFactory.initBeanWrapper(bw); - Class factoryClass = null; - Object factoryBean = null; - boolean isStatic = true; + Object factoryBean; + Class factoryClass; + boolean isStatic; String factoryBeanName = mbd.getFactoryBeanName(); if (factoryBeanName != null) { @@ -290,7 +300,9 @@ class ConstructorResolver { } else { // It's a static factory method on the bean class. + factoryBean = null; factoryClass = mbd.getBeanClass(); + isStatic = true; } Method factoryMethodToUse = null; @@ -335,7 +347,7 @@ class ConstructorResolver { int minTypeDiffWeight = Integer.MAX_VALUE; ConstructorArgumentValues resolvedValues = null; - int minNrOfArgs = 0; + int minNrOfArgs; if (explicitArgs != null) { minNrOfArgs = explicitArgs.length; } @@ -357,7 +369,7 @@ class ConstructorResolver { candidate.getName().equals(mbd.getFactoryMethodName()) && paramTypes.length >= minNrOfArgs) { - ArgumentsHolder args = null; + ArgumentsHolder args; if (resolvedValues != null) { // Resolved contructor arguments: type conversion and/or autowiring necessary.