added first cut of getBean(Class) lookup method

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2164 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
Juergen Hoeller 2009-10-20 19:52:30 +00:00
parent e1e66c3982
commit 0a9a69b6c9
7 changed files with 42 additions and 55 deletions

View File

@ -149,6 +149,15 @@ public interface BeanFactory {
*/ */
<T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException;
/**
* 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.
* {@literal null} is disallowed.
* @return bean matching required type
* @throws NoSuchBeanDefinitionException if there is not exactly one matching bean found
*/
<T> T getBean(Class<T> requiredType) throws BeansException;
/** /**
* Return an instance, which may be shared or independent, of the specified bean. * Return an instance, which may be shared or independent, of the specified bean.
* <p>Allows for specifying explicit constructor arguments / factory method arguments, * <p>Allows for specifying explicit constructor arguments / factory method arguments,

View File

@ -242,6 +242,19 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// Implementation of ListableBeanFactory interface // Implementation of ListableBeanFactory interface
//--------------------------------------------------------------------- //---------------------------------------------------------------------
public <T> T getBean(Class<T> requiredType) throws BeansException {
String[] beanNames = getBeanNamesForType(requiredType);
if (beanNames.length == 1) {
return getBean(beanNames[0], requiredType);
}
else if (beanNames.length == 0 && getParentBeanFactory() != null) {
return getParentBeanFactory().getBean(requiredType);
}
else {
throw new NoSuchBeanDefinitionException(requiredType, "expected single bean but found " + beanNames.length);
}
}
@Override @Override
public boolean containsBeanDefinition(String beanName) { public boolean containsBeanDefinition(String beanName) {
return this.beanDefinitionMap.containsKey(beanName); return this.beanDefinitionMap.containsKey(beanName);

View File

@ -112,6 +112,16 @@ public class StaticListableBeanFactory implements ListableBeanFactory {
return (T) bean; return (T) bean;
} }
public <T> T getBean(Class<T> requiredType) throws BeansException {
String[] beanNames = getBeanNamesForType(requiredType);
if (beanNames.length == 1) {
return getBean(beanNames[0], requiredType);
}
else {
throw new NoSuchBeanDefinitionException(requiredType, "expected single bean but found " + beanNames.length);
}
}
public Object getBean(String name, Object... args) throws BeansException { public Object getBean(String name, Object... args) throws BeansException {
if (args != null) { if (args != null) {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(

View File

@ -64,7 +64,7 @@ public abstract class AbstractBeanFactoryTests extends TestCase {
public void testGetBeanWithNullArg() { public void testGetBeanWithNullArg() {
try { try {
getBeanFactory().getBean(null); getBeanFactory().getBean((String) null);
fail("Can't get null bean"); fail("Can't get null bean");
} }
catch (IllegalArgumentException ex) { catch (IllegalArgumentException ex) {

View File

@ -892,6 +892,10 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
return getBeanFactory().getBean(name, requiredType); return getBeanFactory().getBean(name, requiredType);
} }
public <T> T getBean(Class<T> requiredType) throws BeansException {
return getBeanFactory().getBean(requiredType);
}
public Object getBean(String name, Object... args) throws BeansException { public Object getBean(String name, Object... args) throws BeansException {
return getBeanFactory().getBean(name, args); return getBeanFactory().getBean(name, args);
} }

View File

@ -118,6 +118,10 @@ public class SimpleJndiBeanFactory extends JndiLocatorSupport implements BeanFac
} }
} }
public <T> T getBean(Class<T> requiredType) throws BeansException {
return getBean(requiredType.getSimpleName(), requiredType);
}
public Object getBean(String name, Object... args) throws BeansException { public Object getBean(String name, Object... args) throws BeansException {
if (args != null) { if (args != null) {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(

View File

@ -31,10 +31,7 @@ import org.atinject.tck.auto.accessories.SpareTire;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AutowireCandidateQualifier;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; import org.springframework.context.annotation.AnnotatedBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.ScopeMetadata; import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.context.annotation.ScopeMetadataResolver; import org.springframework.context.annotation.ScopeMetadataResolver;
@ -71,59 +68,9 @@ public class SpringAtInjectTck {
bdr.registerBean(FuelTank.class); bdr.registerBean(FuelTank.class);
ac.refresh(); ac.refresh();
Car car = ac.getBean("convertible", Car.class); Car car = ac.getBean(Car.class);
return Tck.testsFor(car, false, true); return Tck.testsFor(car, false, true);
} }
public static Test suiteX() {
GenericApplicationContext ac = new GenericApplicationContext();
GenericBeanDefinition carDef = new GenericBeanDefinition();
carDef.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
carDef.setBeanClass(Convertible.class);
ac.registerBeanDefinition("car", carDef);
GenericBeanDefinition driversSeatDef = new GenericBeanDefinition();
driversSeatDef.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
driversSeatDef.setBeanClass(DriversSeat.class);
driversSeatDef.addQualifier(new AutowireCandidateQualifier(Drivers.class));
ac.registerBeanDefinition("driversSeat", driversSeatDef);
GenericBeanDefinition seatDef = new GenericBeanDefinition();
seatDef.setBeanClass(Seat.class);
seatDef.setPrimary(true);
ac.registerBeanDefinition("seat", seatDef);
GenericBeanDefinition engineDef = new GenericBeanDefinition();
engineDef.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
engineDef.setBeanClass(V8Engine.class);
ac.registerBeanDefinition("engine", engineDef);
GenericBeanDefinition spareDef = new GenericBeanDefinition();
spareDef.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
spareDef.setBeanClass(SpareTire.class);
spareDef.addQualifier(new AutowireCandidateQualifier(Drivers.class));
ac.registerBeanDefinition("spare", spareDef);
GenericBeanDefinition cupholderDef = new GenericBeanDefinition();
cupholderDef.setBeanClass(Cupholder.class);
ac.registerBeanDefinition("cupholder", cupholderDef);
GenericBeanDefinition tireDef = new GenericBeanDefinition();
tireDef.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
tireDef.setBeanClass(Tire.class);
tireDef.setPrimary(true);
ac.registerBeanDefinition("tire", tireDef);
GenericBeanDefinition fuelTankDef = new GenericBeanDefinition();
fuelTankDef.setBeanClass(FuelTank.class);
ac.registerBeanDefinition("fuelTank", fuelTankDef);
AnnotationConfigUtils.registerAnnotationConfigProcessors(ac);
ac.refresh();
Car car = ac.getBean("car", Car.class);
return Tck.testsFor(car, false, true);
}
} }