PersistenceAnnotationBeanPostProcessor obtains default EntityManagerFactory via getBean(Class) algorithm

Issue: SPR-7549
This commit is contained in:
Juergen Hoeller 2016-08-11 22:42:06 +02:00
parent eeeab27f1f
commit 6157fad91f
7 changed files with 205 additions and 92 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -153,12 +153,12 @@ public interface BeanFactory {
/** /**
* Return the bean instance that uniquely matches the given object type, if any. * Return the bean instance that uniquely matches the given object type, if any.
* @param requiredType type the bean must match; can be an interface or superclass.
* {@code null} is disallowed.
* <p>This method goes into {@link ListableBeanFactory} by-type lookup territory * <p>This method goes into {@link ListableBeanFactory} by-type lookup territory
* but may also be translated into a conventional by-name lookup based on the name * but may also be translated into a conventional by-name lookup based on the name
* of the given type. For more extensive retrieval operations across sets of beans, * of the given type. For more extensive retrieval operations across sets of beans,
* use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}.
* @param requiredType type the bean must match; can be an interface or superclass.
* {@code null} is disallowed.
* @return an instance of the single bean matching the required type * @return an instance of the single bean matching the required type
* @throws NoSuchBeanDefinitionException if no bean of the given type was found * @throws NoSuchBeanDefinitionException if no bean of the given type was found
* @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found * @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2006 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,10 +17,10 @@
package org.springframework.beans.factory; package org.springframework.beans.factory;
/** /**
* Counterpart of BeanNameAware. Returns the bean name of an object. * Counterpart of {@link BeanNameAware}. Returns the bean name of an object.
* *
* <p>This interface can be introduced to avoid a brittle dependence * <p>This interface can be introduced to avoid a brittle dependence on
* on bean name in objects used with Spring IoC and Spring AOP. * bean name in objects used with Spring IoC and Spring AOP.
* *
* @author Rod Johnson * @author Rod Johnson
* @since 2.0 * @since 2.0
@ -29,7 +29,7 @@ package org.springframework.beans.factory;
public interface NamedBean { public interface NamedBean {
/** /**
* Return the name of this bean in a Spring bean factory. * Return the name of this bean in a Spring bean factory, if known.
*/ */
String getBeanName(); String getBeanName();

View File

@ -21,6 +21,8 @@ import java.util.Set;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.TypeConverter; import org.springframework.beans.TypeConverter;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
/** /**
* Extension of the {@link org.springframework.beans.factory.BeanFactory} * Extension of the {@link org.springframework.beans.factory.BeanFactory}
@ -154,15 +156,6 @@ public interface AutowireCapableBeanFactory extends BeanFactory {
*/ */
Object configureBean(Object existingBean, String beanName) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException;
/**
* Resolve the specified dependency against the beans defined in this factory.
* @param descriptor the descriptor for the dependency
* @param beanName the name of the bean which declares the present dependency
* @return the resolved object, or {@code null} if none found
* @throws BeansException if dependency resolution failed
*/
Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// Specialized methods for fine-grained control over the bean lifecycle // Specialized methods for fine-grained control over the bean lifecycle
@ -312,18 +305,55 @@ public interface AutowireCapableBeanFactory extends BeanFactory {
*/ */
void destroyBean(Object existingBean); void destroyBean(Object existingBean);
//-------------------------------------------------------------------------
// Delegate methods for resolving injection points
//-------------------------------------------------------------------------
/**
* Resolve the bean instance that uniquely matches the given object type, if any,
* including its bean name.
* <p>This is effectively a variant of {@link #getBean(Class)} which preserves the
* bean name of the matching instance.
* @param requiredType type the bean must match; can be an interface or superclass.
* {@code null} is disallowed.
* @return the bean name plus bean instance
* @throws NoSuchBeanDefinitionException if no bean of the given type was found
* @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found
* @throws BeansException if the bean could not be created
* @since 4.3.3
* @see #getBean(Class)
*/
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
/** /**
* Resolve the specified dependency against the beans defined in this factory. * Resolve the specified dependency against the beans defined in this factory.
* @param descriptor the descriptor for the dependency * @param descriptor the descriptor for the dependency
* @param beanName the name of the bean which declares the present dependency * @param requestingBeanName the name of the bean which declares the present dependency
* @param autowiredBeanNames a Set that all names of autowired beans (used for
* resolving the present dependency) are supposed to be added to
* @param typeConverter the TypeConverter to use for populating arrays and
* collections
* @return the resolved object, or {@code null} if none found * @return the resolved object, or {@code null} if none found
* @throws BeansException if dependency resolution failed * @throws NoSuchBeanDefinitionException if no matching bean was found
* @throws NoUniqueBeanDefinitionException if more than one matching bean was found
* @throws BeansException if dependency resolution failed for any other reason
* @see #resolveDependency(DependencyDescriptor, String, Set, TypeConverter)
* @since 2.5
*/ */
Object resolveDependency(DependencyDescriptor descriptor, String beanName, Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException;
/**
* Resolve the specified dependency against the beans defined in this factory.
* @param descriptor the descriptor for the dependency
* @param requestingBeanName the name of the bean which declares the present dependency
* @param autowiredBeanNames a Set that all names of autowired beans (used for resolving
* the present dependency) are supposed to be added to
* @param typeConverter the TypeConverter to use for populating arrays and collections
* @return the resolved object, or {@code null} if none found
* @throws NoSuchBeanDefinitionException if no matching bean was found
* @throws NoUniqueBeanDefinitionException if more than one matching bean was found
* @throws BeansException if dependency resolution failed for any other reason
* @see DependencyDescriptor
* @since 2.5
*/
Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
} }

View File

@ -0,0 +1,56 @@
/*
* Copyright 2002-2016 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.config;
import org.springframework.beans.factory.NamedBean;
/**
* A simple holder for a given bean name plus bean instance.
*
* @author Juergen Hoeller
* @since 4.3.3
* @see AutowireCapableBeanFactory#resolveNamedBean(Class)
*/
public class NamedBeanHolder<T> implements NamedBean {
private final String beanName;
private final T beanInstance;
/**
* Create a new holder for the given bean name plus instance.
*/
public NamedBeanHolder(String beanName, T beanInstance) {
this.beanName = beanName;
this.beanInstance = beanInstance;
}
@Override
public String getBeanName() {
return this.beanName;
}
/**
* Return the corresponding bean instance.
*/
public T getBeanInstance() {
return this.beanInstance;
}
}

View File

@ -32,7 +32,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -62,11 +61,13 @@ import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.SmartFactoryBean; import org.springframework.beans.factory.SmartFactoryBean;
import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.config.NamedBeanHolder;
import org.springframework.core.OrderComparator; import org.springframework.core.OrderComparator;
import org.springframework.core.ResolvableType; import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
@ -326,43 +327,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
@Override @Override
public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException { public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
Assert.notNull(requiredType, "Required type must not be null"); NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args);
String[] beanNames = getBeanNamesForType(requiredType); if (namedBean != null) {
if (beanNames.length > 1) { return namedBean.getBeanInstance();
ArrayList<String> autowireCandidates = new ArrayList<>();
for (String beanName : beanNames) {
if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {
autowireCandidates.add(beanName);
}
}
if (autowireCandidates.size() > 0) {
beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
}
} }
if (beanNames.length == 1) { BeanFactory parent = getParentBeanFactory();
return getBean(beanNames[0], requiredType, args); if (parent != null) {
} return parent.getBean(requiredType, args);
else if (beanNames.length > 1) {
Map<String, Object> candidates = new HashMap<>();
for (String beanName : beanNames) {
candidates.put(beanName, getBean(beanName, requiredType, args));
}
String primaryCandidate = determinePrimaryCandidate(candidates, requiredType);
if (primaryCandidate != null) {
return getBean(primaryCandidate, requiredType, args);
}
String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType);
if (priorityCandidate != null) {
return getBean(priorityCandidate, requiredType, args);
}
throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());
}
else if (getParentBeanFactory() != null) {
return getParentBeanFactory().getBean(requiredType, args);
}
else {
throw new NoSuchBeanDefinitionException(requiredType);
} }
throw new NoSuchBeanDefinitionException(requiredType);
} }
@ -642,13 +615,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
else if (containsSingleton(beanName)) { else if (containsSingleton(beanName)) {
return isAutowireCandidate(beanName, new RootBeanDefinition(getType(beanName)), descriptor, resolver); return isAutowireCandidate(beanName, new RootBeanDefinition(getType(beanName)), descriptor, resolver);
} }
else if (getParentBeanFactory() instanceof DefaultListableBeanFactory) {
BeanFactory parent = getParentBeanFactory();
if (parent instanceof DefaultListableBeanFactory) {
// No bean definition found in this factory -> delegate to parent. // No bean definition found in this factory -> delegate to parent.
return ((DefaultListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor, resolver); return ((DefaultListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor, resolver);
} }
else if (getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { else if (parent instanceof ConfigurableListableBeanFactory) {
// If no DefaultListableBeanFactory, can't pass the resolver along. // If no DefaultListableBeanFactory, can't pass the resolver along.
return ((ConfigurableListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor); return ((ConfigurableListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor);
} }
else { else {
return true; return true;
@ -989,24 +964,74 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
//--------------------------------------------------------------------- //---------------------------------------------------------------------
@Override @Override
public Object resolveDependency(DependencyDescriptor descriptor, String beanName, public <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException {
NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, (Object[]) null);
if (namedBean != null) {
return namedBean;
}
BeanFactory parent = getParentBeanFactory();
if (parent instanceof AutowireCapableBeanFactory) {
return ((AutowireCapableBeanFactory) parent).resolveNamedBean(requiredType);
}
return null;
}
private <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType, Object... args) throws BeansException {
Assert.notNull(requiredType, "Required type must not be null");
String[] beanNames = getBeanNamesForType(requiredType);
if (beanNames.length > 1) {
ArrayList<String> autowireCandidates = new ArrayList<>();
for (String beanName : beanNames) {
if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {
autowireCandidates.add(beanName);
}
}
if (!autowireCandidates.isEmpty()) {
beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
}
}
if (beanNames.length == 1) {
String beanName = beanNames[0];
return new NamedBeanHolder<>(beanName, getBean(beanName, requiredType, args));
}
else if (beanNames.length > 1) {
Map<String, Object> candidates = new LinkedHashMap<>();
for (String beanName : beanNames) {
candidates.put(beanName, getBean(beanName, requiredType, args));
}
String primaryCandidate = determinePrimaryCandidate(candidates, requiredType);
if (primaryCandidate != null) {
return new NamedBeanHolder<>(primaryCandidate, getBean(primaryCandidate, requiredType, args));
}
String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType);
if (priorityCandidate != null) {
return new NamedBeanHolder<>(priorityCandidate, getBean(priorityCandidate, requiredType, args));
}
throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());
}
return null;
}
@Override
public Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException { Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
descriptor.initParameterNameDiscovery(getParameterNameDiscoverer()); descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
if (Optional.class == descriptor.getDependencyType()) { if (Optional.class == descriptor.getDependencyType()) {
return createOptionalDependency(descriptor, beanName); return createOptionalDependency(descriptor, requestingBeanName);
} }
else if (ObjectFactory.class == descriptor.getDependencyType() || else if (ObjectFactory.class == descriptor.getDependencyType() ||
ObjectProvider.class == descriptor.getDependencyType()) { ObjectProvider.class == descriptor.getDependencyType()) {
return new DependencyObjectProvider(descriptor, beanName); return new DependencyObjectProvider(descriptor, requestingBeanName);
} }
else if (javaxInjectProviderClass == descriptor.getDependencyType()) { else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
return new Jsr330ProviderFactory().createDependencyProvider(descriptor, beanName); return new Jsr330ProviderFactory().createDependencyProvider(descriptor, requestingBeanName);
} }
else { else {
Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, beanName); Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(
descriptor, requestingBeanName);
if (result == null) { if (result == null) {
result = doResolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter); result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
} }
return result; return result;
} }
@ -1337,9 +1362,9 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
if (containsBeanDefinition(beanName)) { if (containsBeanDefinition(beanName)) {
return getMergedLocalBeanDefinition(beanName).isPrimary(); return getMergedLocalBeanDefinition(beanName).isPrimary();
} }
BeanFactory parentFactory = getParentBeanFactory(); BeanFactory parent = getParentBeanFactory();
return (parentFactory instanceof DefaultListableBeanFactory && return (parent instanceof DefaultListableBeanFactory &&
((DefaultListableBeanFactory) parentFactory).isPrimary(beanName, beanInstance)); ((DefaultListableBeanFactory) parent).isPrimary(beanName, beanInstance));
} }
/** /**
@ -1415,8 +1440,9 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
} }
} }
if (getParentBeanFactory() instanceof DefaultListableBeanFactory) { BeanFactory parent = getParentBeanFactory();
((DefaultListableBeanFactory) getParentBeanFactory()).checkBeanNotOfRequiredType(type, descriptor); if (parent instanceof DefaultListableBeanFactory) {
((DefaultListableBeanFactory) parent).checkBeanNotOfRequiredType(type, descriptor);
} }
} }

View File

@ -41,14 +41,14 @@ import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.annotation.InjectionMetadata; import org.springframework.beans.factory.annotation.InjectionMetadata;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.config.NamedBeanHolder;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor; import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.BridgeMethodResolver; import org.springframework.core.BridgeMethodResolver;
@ -569,21 +569,16 @@ public class PersistenceAnnotationBeanPostProcessor
protected EntityManagerFactory findDefaultEntityManagerFactory(String requestingBeanName) protected EntityManagerFactory findDefaultEntityManagerFactory(String requestingBeanName)
throws NoSuchBeanDefinitionException { throws NoSuchBeanDefinitionException {
String[] beanNames = if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this.beanFactory, EntityManagerFactory.class); // Fancy variant with dependency registration
if (beanNames.length == 1) { ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory) this.beanFactory;
String unitName = beanNames[0]; NamedBeanHolder<EntityManagerFactory> emfHolder = clbf.resolveNamedBean(EntityManagerFactory.class);
EntityManagerFactory emf = (EntityManagerFactory) this.beanFactory.getBean(unitName); clbf.registerDependentBean(emfHolder.getBeanName(), requestingBeanName);
if (this.beanFactory instanceof ConfigurableBeanFactory) { return emfHolder.getBeanInstance();
((ConfigurableBeanFactory) this.beanFactory).registerDependentBean(unitName, requestingBeanName);
}
return emf;
}
else if (beanNames.length > 1) {
throw new NoUniqueBeanDefinitionException(EntityManagerFactory.class, beanNames);
} }
else { else {
throw new NoSuchBeanDefinitionException(EntityManagerFactory.class); // Plain variant: just find a default bean
return this.beanFactory.getBean(EntityManagerFactory.class);
} }
} }

View File

@ -31,6 +31,7 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.config.NamedBeanHolder;
import org.springframework.beans.factory.support.StaticListableBeanFactory; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
@ -393,12 +394,17 @@ class StubWebApplicationContext implements WebApplicationContext {
} }
@Override @Override
public Object resolveDependency(DependencyDescriptor descriptor, String beanName) { public <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException {
throw new UnsupportedOperationException("Dependency resolution not supported"); throw new UnsupportedOperationException("Dependency resolution not supported");
} }
@Override @Override
public Object resolveDependency(DependencyDescriptor descriptor, String beanName, public Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) {
throw new UnsupportedOperationException("Dependency resolution not supported");
}
@Override
public Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) { Set<String> autowiredBeanNames, TypeConverter typeConverter) {
throw new UnsupportedOperationException("Dependency resolution not supported"); throw new UnsupportedOperationException("Dependency resolution not supported");
} }