Browse Source

Refined throwing of BeanCreationExceptions (and reflection exceptions)

Issue: SPR-14883
pull/1224/merge
Juergen Hoeller 8 years ago
parent
commit
b3cd1ad7f1
  1. 12
      spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
  2. 18
      spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
  3. 5
      spring-beans/src/main/java/org/springframework/beans/factory/support/ImplicitlyAppearedSingletonException.java
  4. 10
      spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java
  5. 6
      spring-core/src/main/java/org/springframework/util/ReflectionUtils.java
  6. 10
      spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

12
spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

@ -355,7 +355,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
@Override @Override
public PropertyValues postProcessPropertyValues( public PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs); InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try { try {
@ -404,14 +404,8 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
if (metadata != null) { if (metadata != null) {
metadata.clear(pvs); metadata.clear(pvs);
} }
try { metadata = buildAutowiringMetadata(clazz);
metadata = buildAutowiringMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
catch (NoClassDefFoundError err) {
throw new IllegalStateException("Failed to introspect bean class [" + clazz.getName() +
"] for autowiring metadata: could not find class that it depends on", err);
}
} }
} }
} }

18
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java

@ -145,8 +145,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>(); private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();
/** Cache of unfinished FactoryBean instances: FactoryBean name --> BeanWrapper */ /** Cache of unfinished FactoryBean instances: FactoryBean name --> BeanWrapper */
private final Map<String, BeanWrapper> factoryBeanInstanceCache = private final Map<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>(16);
new ConcurrentHashMap<>(16);
/** Cache of filtered PropertyDescriptors: bean Class -> PropertyDescriptor array */ /** Cache of filtered PropertyDescriptors: bean Class -> PropertyDescriptor array */
private final ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache = private final ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache =
@ -536,7 +535,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
} }
catch (Throwable ex) { catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName, throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of bean type [" + beanType.getName() + "] failed", ex); "Post-processing of merged bean definition failed", ex);
} }
mbd.postProcessed = true; mbd.postProcessed = true;
} }
@ -721,8 +720,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
paramNames = pnd.getParameterNames(factoryMethod); paramNames = pnd.getParameterNames(factoryMethod);
} }
ConstructorArgumentValues cav = mbd.getConstructorArgumentValues(); ConstructorArgumentValues cav = mbd.getConstructorArgumentValues();
Set<ConstructorArgumentValues.ValueHolder> usedValueHolders = Set<ConstructorArgumentValues.ValueHolder> usedValueHolders = new HashSet<>(paramTypes.length);
new HashSet<>(paramTypes.length);
Object[] args = new Object[paramTypes.length]; Object[] args = new Object[paramTypes.length];
for (int i = 0; i < args.length; i++) { for (int i = 0; i < args.length; i++) {
ConstructorArgumentValues.ValueHolder valueHolder = cav.getArgumentValue( ConstructorArgumentValues.ValueHolder valueHolder = cav.getArgumentValue(
@ -952,12 +950,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
* @param mbd the merged bean definition for the bean * @param mbd the merged bean definition for the bean
* @param beanType the actual type of the managed bean instance * @param beanType the actual type of the managed bean instance
* @param beanName the name of the bean * @param beanName the name of the bean
* @throws BeansException if any post-processing failed
* @see MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition * @see MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
*/ */
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
throws BeansException {
for (BeanPostProcessor bp : getBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof MergedBeanDefinitionPostProcessor) { if (bp instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
@ -1000,12 +995,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
* @param beanClass the class of the bean to be instantiated * @param beanClass the class of the bean to be instantiated
* @param beanName the name of the bean * @param beanName the name of the bean
* @return the bean object to use instead of a default instance of the target bean, or {@code null} * @return the bean object to use instead of a default instance of the target bean, or {@code null}
* @throws BeansException if any post-processing failed
* @see InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation * @see InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
*/ */
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
throws BeansException {
for (BeanPostProcessor bp : getBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) { if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

5
spring-beans/src/main/java/org/springframework/beans/factory/support/ImplicitlyAppearedSingletonException.java

@ -17,8 +17,11 @@
package org.springframework.beans.factory.support; package org.springframework.beans.factory.support;
/** /**
* Internal exception to be propagated from {@link ConstructorResolver}. * Internal exception to be propagated from {@link ConstructorResolver},
* passed through to the initiating {@link DefaultSingletonBeanRegistry}
* (without wrapping in a {@code BeanCreationException}).
* *
* @author Juergen Hoeller
* @since 5.0 * @since 5.0
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")

10
spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java

@ -336,14 +336,8 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean
if (metadata != null) { if (metadata != null) {
metadata.clear(pvs); metadata.clear(pvs);
} }
try { metadata = buildResourceMetadata(clazz);
metadata = buildResourceMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
catch (NoClassDefFoundError err) {
throw new IllegalStateException("Failed to introspect bean class [" + clazz.getName() +
"] for resource metadata: could not find class that it depends on", err);
}
} }
} }
} }

6
spring-core/src/main/java/org/springframework/util/ReflectionUtils.java

@ -60,14 +60,12 @@ public abstract class ReflectionUtils {
* Cache for {@link Class#getDeclaredMethods()} plus equivalent default methods * Cache for {@link Class#getDeclaredMethods()} plus equivalent default methods
* from Java 8 based interfaces, allowing for fast iteration. * from Java 8 based interfaces, allowing for fast iteration.
*/ */
private static final Map<Class<?>, Method[]> declaredMethodsCache = private static final Map<Class<?>, Method[]> declaredMethodsCache = new ConcurrentReferenceHashMap<>(256);
new ConcurrentReferenceHashMap<>(256);
/** /**
* Cache for {@link Class#getDeclaredFields()}, allowing for fast iteration. * Cache for {@link Class#getDeclaredFields()}, allowing for fast iteration.
*/ */
private static final Map<Class<?>, Field[]> declaredFieldsCache = private static final Map<Class<?>, Field[]> declaredFieldsCache = new ConcurrentReferenceHashMap<>(256);
new ConcurrentReferenceHashMap<>(256);
/** /**

10
spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

@ -389,14 +389,8 @@ public class PersistenceAnnotationBeanPostProcessor
if (metadata != null) { if (metadata != null) {
metadata.clear(pvs); metadata.clear(pvs);
} }
try { metadata = buildPersistenceMetadata(clazz);
metadata = buildPersistenceMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
catch (NoClassDefFoundError err) {
throw new IllegalStateException("Failed to introspect bean class [" + clazz.getName() +
"] for persistence metadata: could not find class that it depends on", err);
}
} }
} }
} }

Loading…
Cancel
Save