public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry
DefaultListableBeanFactory
instance and does not assume a specific bean definition format. Implements
the BeanDefinitionRegistry
interface in order to allow for applying any bean definition readers to it.
Typical usage is to register a variety of bean definitions via the
BeanDefinitionRegistry
interface and then call AbstractApplicationContext.refresh()
to initialize those beans
with application context semantics (handling
ApplicationContextAware
, auto-detecting
BeanFactoryPostProcessors
,
etc).
In contrast to other ApplicationContext implementations that create a new
internal BeanFactory instance for each refresh, the internal BeanFactory of
this context is available right from the start, to be able to register bean
definitions on it. AbstractApplicationContext.refresh()
may only be called once.
Usage example:
GenericApplicationContext ctx = new GenericApplicationContext(); XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml")); PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx); propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties")); ctx.refresh(); MyBean myBean = (MyBean) ctx.getBean("myBean"); ...For the typical case of XML bean definitions, simply use
ClassPathXmlApplicationContext
or FileSystemXmlApplicationContext
,
which are easier to set up - but less flexible, since you can just use standard
resource locations for XML bean definitions, rather than mixing arbitrary bean
definition formats. The equivalent in a web environment is
XmlWebApplicationContext
.
For custom application context implementations that are supposed to read
special bean definition formats in a refreshable manner, consider deriving
from the AbstractRefreshableApplicationContext
base class.
registerBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)
,
AbstractApplicationContext.refresh()
,
XmlBeanDefinitionReader
,
PropertiesBeanDefinitionReader
DefaultResourceLoader.ClassPathContextResource
Modifier and Type | Field and Description |
---|---|
private DefaultListableBeanFactory |
beanFactory |
private boolean |
refreshed |
private ResourceLoader |
resourceLoader |
APPLICATION_EVENT_MULTICASTER_BEAN_NAME, LIFECYCLE_PROCESSOR_BEAN_NAME, logger, MESSAGE_SOURCE_BEAN_NAME
CONFIG_LOCATION_DELIMITERS, CONVERSION_SERVICE_BEAN_NAME, ENVIRONMENT_BEAN_NAME, LOAD_TIME_WEAVER_BEAN_NAME, SYSTEM_ENVIRONMENT_BEAN_NAME, SYSTEM_PROPERTIES_BEAN_NAME
FACTORY_BEAN_PREFIX
CLASSPATH_ALL_URL_PREFIX
CLASSPATH_URL_PREFIX
Constructor and Description |
---|
GenericApplicationContext()
Create a new GenericApplicationContext.
|
GenericApplicationContext(ApplicationContext parent)
Create a new GenericApplicationContext with the given parent.
|
GenericApplicationContext(DefaultListableBeanFactory beanFactory)
Create a new GenericApplicationContext with the given DefaultListableBeanFactory.
|
GenericApplicationContext(DefaultListableBeanFactory beanFactory,
ApplicationContext parent)
Create a new GenericApplicationContext with the given DefaultListableBeanFactory.
|
Modifier and Type | Method and Description |
---|---|
protected void |
cancelRefresh(BeansException ex)
Cancel this context's refresh attempt, resetting the
active flag
after an exception got thrown. |
protected void |
closeBeanFactory()
Not much to do: We hold a single internal BeanFactory that will never
get released.
|
BeanDefinition |
getBeanDefinition(java.lang.String beanName)
Return the BeanDefinition for the given bean name.
|
ConfigurableListableBeanFactory |
getBeanFactory()
Return the single internal BeanFactory held by this context
(as ConfigurableListableBeanFactory).
|
DefaultListableBeanFactory |
getDefaultListableBeanFactory()
Return the underlying bean factory of this context,
available for registering bean definitions.
|
Resource |
getResource(java.lang.String location)
This implementation delegates to this context's ResourceLoader if set,
falling back to the default superclass behavior else.
|
Resource[] |
getResources(java.lang.String locationPattern)
This implementation delegates to this context's ResourceLoader if it
implements the ResourcePatternResolver interface, falling back to the
default superclass behavior else.
|
boolean |
isAlias(java.lang.String beanName)
Determine whether this given name is defines as an alias
(as opposed to the name of an actually registered component).
|
boolean |
isBeanNameInUse(java.lang.String beanName)
Determine whether the given bean name is already in use within this registry,
i.e.
|
protected void |
refreshBeanFactory()
Do nothing: We hold a single internal BeanFactory and rely on callers
to register beans through our public methods (or the BeanFactory's).
|
void |
registerAlias(java.lang.String beanName,
java.lang.String alias)
Given a name, register an alias for it.
|
void |
registerBeanDefinition(java.lang.String beanName,
BeanDefinition beanDefinition)
Register a new bean definition with this registry.
|
void |
removeAlias(java.lang.String alias)
Remove the specified alias from this registry.
|
void |
removeBeanDefinition(java.lang.String beanName)
Remove the BeanDefinition for the given name.
|
void |
setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding)
Set whether it should be allowed to override bean definitions by registering
a different definition with the same name, automatically replacing the former.
|
void |
setAllowCircularReferences(boolean allowCircularReferences)
Set whether to allow circular references between beans - and automatically
try to resolve them.
|
void |
setId(java.lang.String id)
Set the unique id of this application context.
|
void |
setParent(ApplicationContext parent)
Set the parent of this application context, also setting
the parent of the internal BeanFactory accordingly.
|
void |
setResourceLoader(ResourceLoader resourceLoader)
Set a ResourceLoader to use for this context.
|
addApplicationListener, addBeanFactoryPostProcessor, assertBeanFactoryActive, close, containsBean, containsBeanDefinition, containsLocalBean, createEnvironment, destroy, destroyBeans, doClose, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationEventMulticaster, getApplicationListeners, getApplicationName, getAutowireCapableBeanFactory, getBean, getBean, getBean, getBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanFactoryPostProcessors, getBeanNamesForAnnotation, getBeanNamesForType, getBeanNamesForType, getBeansOfType, getBeansOfType, getBeansWithAnnotation, getDisplayName, getEnvironment, getId, getInternalParentBeanFactory, getInternalParentMessageSource, getLifecycleProcessor, getMessage, getMessage, getMessage, getParent, getParentBeanFactory, getResourcePatternResolver, getStartupDate, getType, initApplicationEventMulticaster, initLifecycleProcessor, initMessageSource, initPropertySources, invokeBeanFactoryPostProcessors, isActive, isPrototype, isRunning, isSingleton, isTypeMatch, obtainFreshBeanFactory, onClose, onRefresh, postProcessBeanFactory, prepareBeanFactory, prepareRefresh, publishEvent, refresh, registerBeanPostProcessors, registerListeners, registerShutdownHook, setDisplayName, setEnvironment, start, stop, toString
getClassLoader, getResourceByPath, setClassLoader
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
containsBeanDefinition, getBeanDefinitionCount, getBeanDefinitionNames
getAliases
getClassLoader
private final DefaultListableBeanFactory beanFactory
private ResourceLoader resourceLoader
private boolean refreshed
public GenericApplicationContext()
public GenericApplicationContext(DefaultListableBeanFactory beanFactory)
beanFactory
- the DefaultListableBeanFactory instance to use for this contextregisterBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)
,
AbstractApplicationContext.refresh()
public GenericApplicationContext(ApplicationContext parent)
parent
- the parent application contextregisterBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)
,
AbstractApplicationContext.refresh()
public GenericApplicationContext(DefaultListableBeanFactory beanFactory, ApplicationContext parent)
beanFactory
- the DefaultListableBeanFactory instance to use for this contextparent
- the parent application contextregisterBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)
,
AbstractApplicationContext.refresh()
public void setParent(ApplicationContext parent)
setParent
in interface ConfigurableApplicationContext
setParent
in class AbstractApplicationContext
parent
- the parent contextConfigurableBeanFactory.setParentBeanFactory(org.springframework.beans.factory.BeanFactory)
public void setId(java.lang.String id)
AbstractApplicationContext
Default is the object id of the context instance, or the name of the context bean if the context is itself defined as a bean.
setId
in interface ConfigurableApplicationContext
setId
in class AbstractApplicationContext
id
- the unique id of the contextpublic void setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding)
public void setAllowCircularReferences(boolean allowCircularReferences)
Default is "true". Turn this off to throw an exception when encountering a circular reference, disallowing them completely.
public void setResourceLoader(ResourceLoader resourceLoader)
getResource
calls to the given ResourceLoader.
If not set, default resource loading will apply.
The main reason to specify a custom ResourceLoader is to resolve resource paths (without URL prefix) in a specific fashion. The default behavior is to resolve such paths as class path locations. To resolve resource paths as file system locations, specify a FileSystemResourceLoader here.
You can also pass in a full ResourcePatternResolver, which will
be autodetected by the context and used for getResources
calls as well. Else, default resource pattern matching will apply.
public Resource getResource(java.lang.String location)
getResource
in interface ResourceLoader
getResource
in class DefaultResourceLoader
location
- the resource locationsetResourceLoader(org.springframework.core.io.ResourceLoader)
public Resource[] getResources(java.lang.String locationPattern) throws java.io.IOException
getResources
in interface ResourcePatternResolver
getResources
in class AbstractApplicationContext
locationPattern
- the location pattern to resolvejava.io.IOException
- in case of I/O errorssetResourceLoader(org.springframework.core.io.ResourceLoader)
protected final void refreshBeanFactory() throws java.lang.IllegalStateException
refreshBeanFactory
in class AbstractApplicationContext
java.lang.IllegalStateException
- if already initialized and multiple refresh
attempts are not supportedregisterBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)
protected void cancelRefresh(BeansException ex)
AbstractApplicationContext
active
flag
after an exception got thrown.cancelRefresh
in class AbstractApplicationContext
ex
- the exception that led to the cancellationprotected final void closeBeanFactory()
closeBeanFactory
in class AbstractApplicationContext
public final ConfigurableListableBeanFactory getBeanFactory()
getBeanFactory
in interface ConfigurableApplicationContext
getBeanFactory
in class AbstractApplicationContext
null
)AbstractApplicationContext.refreshBeanFactory()
,
AbstractApplicationContext.closeBeanFactory()
public final DefaultListableBeanFactory getDefaultListableBeanFactory()
NOTE: You need to call AbstractApplicationContext.refresh()
to initialize the
bean factory and its contained beans with application context semantics
(autodetecting BeanFactoryPostProcessors, etc).
public void registerBeanDefinition(java.lang.String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException
BeanDefinitionRegistry
registerBeanDefinition
in interface BeanDefinitionRegistry
beanName
- the name of the bean instance to registerbeanDefinition
- definition of the bean instance to registerBeanDefinitionStoreException
- if the BeanDefinition is invalid
or if there is already a BeanDefinition for the specified bean name
(and we are not allowed to override it)RootBeanDefinition
,
ChildBeanDefinition
public void removeBeanDefinition(java.lang.String beanName) throws NoSuchBeanDefinitionException
BeanDefinitionRegistry
removeBeanDefinition
in interface BeanDefinitionRegistry
beanName
- the name of the bean instance to registerNoSuchBeanDefinitionException
- if there is no such bean definitionpublic BeanDefinition getBeanDefinition(java.lang.String beanName) throws NoSuchBeanDefinitionException
BeanDefinitionRegistry
getBeanDefinition
in interface BeanDefinitionRegistry
beanName
- name of the bean to find a definition fornull
)NoSuchBeanDefinitionException
- if there is no such bean definitionpublic boolean isBeanNameInUse(java.lang.String beanName)
BeanDefinitionRegistry
isBeanNameInUse
in interface BeanDefinitionRegistry
beanName
- the name to checkpublic void registerAlias(java.lang.String beanName, java.lang.String alias)
AliasRegistry
registerAlias
in interface AliasRegistry
beanName
- the canonical namealias
- the alias to be registeredpublic void removeAlias(java.lang.String alias)
AliasRegistry
removeAlias
in interface AliasRegistry
alias
- the alias to removepublic boolean isAlias(java.lang.String beanName)
AliasRegistry
isAlias
in interface AliasRegistry
beanName
- the bean name to check