AbstractApplicationContext (Spring Framework 3.2.1.RELEASE API)
Date: 2013-01-24

org.springframework.context.support

## Class AbstractApplicationContext

- java.lang.Object
- - org.springframework.core.io.DefaultResourceLoader
  - - org.springframework.context.support.AbstractApplicationContext

- All Implemented Interfaces:
    Closeable, AutoCloseable, BeanFactory, DisposableBean, HierarchicalBeanFactory, ListableBeanFactory, ApplicationContext, ApplicationEventPublisher, ConfigurableApplicationContext, Lifecycle, MessageSource, EnvironmentCapable, ResourceLoader, ResourcePatternResolver
  Direct Known Subclasses:
    AbstractRefreshableApplicationContext, GenericApplicationContext

      public abstract class AbstractApplicationContext
      extends DefaultResourceLoader
      implements ConfigurableApplicationContext, DisposableBean

  Abstract implementation of the `ApplicationContext` interface. Doesn't mandate the type of storage used for configuration; simply implements common context functionality. Uses the Template Method design pattern, requiring concrete subclasses to implement abstract methods.

  In contrast to a plain BeanFactory, an ApplicationContext is supposed to detect special beans defined in its internal bean factory: Therefore, this class automatically registers `BeanFactoryPostProcessors`, `BeanPostProcessors` and `ApplicationListeners` which are defined as beans in the context.

  A `MessageSource` may also be supplied as a bean in the context, with the name "messageSource"; otherwise, message resolution is delegated to the parent context. Furthermore, a multicaster for application events can be supplied as "applicationEventMulticaster" bean of type `ApplicationEventMulticaster` in the context; otherwise, a default multicaster of type `SimpleApplicationEventMulticaster` will be used.

  Implements resource loading through extending `DefaultResourceLoader`. Consequently treats non-URL resource paths as class path resources (supporting full class path resource names that include the package path, e.g. "mypackage/myresource.dat"), unless the `DefaultResourceLoader.getResourceByPath(java.lang.String)` method is overwritten in a subclass.

  Since:
    January 21, 2001
  Author:
    Rod Johnson, Juergen Hoeller, Mark Fisher
  See Also:
    `refreshBeanFactory()`, `getBeanFactory()`, `BeanFactoryPostProcessor`, `BeanPostProcessor`, `ApplicationEventMulticaster`, `ApplicationListener`, `MessageSource`

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `APPLICATION_EVENT_MULTICASTER_BEAN_NAME` Name of the ApplicationEventMulticaster bean in the factory.
    `static String` | `LIFECYCLE_PROCESSOR_BEAN_NAME` Name of the LifecycleProcessor bean in the factory.
    `protected Log` | `logger` Logger used by this class.
    `static String` | `MESSAGE_SOURCE_BEAN_NAME` Name of the MessageSource bean in the factory.

    - ### Fields inherited from interface org.springframework.context.ConfigurableApplicationContext

      `CONFIG_LOCATION_DELIMITERS, CONVERSION_SERVICE_BEAN_NAME, ENVIRONMENT_BEAN_NAME, LOAD_TIME_WEAVER_BEAN_NAME, SYSTEM_ENVIRONMENT_BEAN_NAME, SYSTEM_PROPERTIES_BEAN_NAME`

    - ### Fields inherited from interface org.springframework.beans.factory.BeanFactory

      `FACTORY_BEAN_PREFIX`

    - ### Fields inherited from interface org.springframework.core.io.support.ResourcePatternResolver

      `CLASSPATH_ALL_URL_PREFIX`

    - ### Fields inherited from interface org.springframework.core.io.ResourceLoader

      `CLASSPATH_URL_PREFIX`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `AbstractApplicationContext()` Create a new AbstractApplicationContext with no parent.
    `AbstractApplicationContext(ApplicationContext parent)` Create a new AbstractApplicationContext with the given parent context.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `addApplicationListener(ApplicationListener<?> listener)` Add a new ApplicationListener that will be notified on context events such as context refresh and context shutdown.
    `void` | `addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor)` Add a new BeanFactoryPostProcessor that will get applied to the internal bean factory of this application context on refresh, before any of the bean definitions get evaluated.
    `protected void` | `addListener(ApplicationListener<?> listener)` Deprecated. as of Spring 3.0, in favor of `addApplicationListener(org.springframework.context.ApplicationListener<?>)`
    `protected void` | `cancelRefresh(BeansException ex)` Cancel this context's refresh attempt, resetting the `active` flag after an exception got thrown.
    `void` | `close()` Close this application context, destroying all beans in its bean factory.
    `protected abstract void` | `closeBeanFactory()` Subclasses must implement this method to release their internal bean factory.
    `boolean` | `containsBean(String name)` Does this bean factory contain a bean definition or externally registered singleton instance with the given name?
    `boolean` | `containsBeanDefinition(String beanName)` Check if this bean factory contains a bean definition with the given name.
    `boolean` | `containsLocalBean(String name)` Return whether the local bean factory contains a bean of the given name, ignoring beans defined in ancestor contexts.
    `protected ConfigurableEnvironment` | `createEnvironment()` Create and return a new `StandardEnvironment`.
    `void` | `destroy()` DisposableBean callback for destruction of this instance.
    `protected void` | `destroyBeans()` Template method for destroying all beans that this context manages.
    `protected void` | `doClose()` Actually performs context closing: publishes a ContextClosedEvent and destroys the singletons in the bean factory of this application context.
    `<A extends Annotation> A` | `findAnnotationOnBean(String beanName, Class<A> annotationType)` Find a `Annotation` of `annotationType` on the specified bean, traversing its interfaces and super classes if no annotation can be found on the given class itself.
    `protected void` | `finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)` Finish the initialization of this context's bean factory, initializing all remaining singleton beans.
    `protected void` | `finishRefresh()` Finish the refresh of this context, invoking the LifecycleProcessor's onRefresh() method and publishing the `ContextRefreshedEvent`.
    `String[]` | `getAliases(String name)` Return the aliases for the given bean name, if any.
    `Collection<ApplicationListener<?>>` | `getApplicationListeners()` Return the list of statically specified ApplicationListeners.
    `String` | `getApplicationName()` Return a name for the deployed application that this context belongs to.
    `AutowireCapableBeanFactory` | `getAutowireCapableBeanFactory()` Return this context's internal bean factory as AutowireCapableBeanFactory, if already available.
    `<T> T` | `getBean(Class<T> requiredType)` Return the bean instance that uniquely matches the given object type, if any.
    `Object` | `getBean(String name)` Return an instance, which may be shared or independent, of the specified bean.
    `<T> T` | `getBean(String name, Class<T> requiredType)` Return an instance, which may be shared or independent, of the specified bean.
    `Object` | `getBean(String name, Object... args)` Return an instance, which may be shared or independent, of the specified bean.
    `int` | `getBeanDefinitionCount()` Return the number of beans defined in the factory.
    `String[]` | `getBeanDefinitionNames()` Return the names of all beans defined in this factory.
    `abstract ConfigurableListableBeanFactory` | `getBeanFactory()` Subclasses must return their internal bean factory here.
    `List<BeanFactoryPostProcessor>` | `getBeanFactoryPostProcessors()` Return the list of BeanFactoryPostProcessors that will get applied to the internal BeanFactory.
    `String[]` | `getBeanNamesForType(Class<?> type)` Return the names of beans matching the given type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.
    `String[]` | `getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit)` Return the names of beans matching the given type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.
    `<T> Map<String,T>` | `getBeansOfType(Class<T> type)` Return the bean instances that match the given object type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.
    `<T> Map<String,T>` | `getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)` Return the bean instances that match the given object type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.
    `Map<String,Object>` | `getBeansWithAnnotation(Class<? extends Annotation> annotationType)` Find all beans whose `Class` has the supplied `Annotation` type.
    `String` | `getDisplayName()` Return a friendly name for this context.
    `ConfigurableEnvironment` | `getEnvironment()` Return the Environment for this application context in configurable form.
    `String` | `getId()` Return the unique id of this application context.
    `protected BeanFactory` | `getInternalParentBeanFactory()` Return the internal bean factory of the parent context if it implements ConfigurableApplicationContext; else, return the parent context itself.
    `protected MessageSource` | `getInternalParentMessageSource()` Return the internal message source of the parent context if it is an AbstractApplicationContext too; else, return the parent context itself.
    `String` | `getMessage(MessageSourceResolvable resolvable, Locale locale)` Try to resolve the message using all the attributes contained within the `MessageSourceResolvable` argument that was passed in.
    `String` | `getMessage(String code, Object[] args, Locale locale)` Try to resolve the message.
    `String` | `getMessage(String code, Object[] args, String defaultMessage, Locale locale)` Try to resolve the message.
    `ApplicationContext` | `getParent()` Return the parent context, or `null` if there is no parent (that is, this context is the root of the context hierarchy).
    `BeanFactory` | `getParentBeanFactory()` Return the parent bean factory, or `null` if there is none.
    `protected ResourcePatternResolver` | `getResourcePatternResolver()` Return the ResourcePatternResolver to use for resolving location patterns into Resource instances.
    `Resource[]` | `getResources(String locationPattern)` Resolve the given location pattern into Resource objects.
    `long` | `getStartupDate()` Return the timestamp (ms) when this context was first loaded.
    `Class<?>` | `getType(String name)` Determine the type of the bean with the given name.
    `protected void` | `initApplicationEventMulticaster()` Initialize the ApplicationEventMulticaster.
    `protected void` | `initLifecycleProcessor()` Initialize the LifecycleProcessor.
    `protected void` | `initMessageSource()` Initialize the MessageSource.
    `protected void` | `initPropertySources()` Replace any stub property sources with actual instances.
    `protected void` | `invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)` Instantiate and invoke all registered BeanFactoryPostProcessor beans, respecting explicit order if given.
    `boolean` | `isActive()` Determine whether this application context is active, that is, whether it has been refreshed at least once and has not been closed yet.
    `boolean` | `isPrototype(String name)` Is this bean a prototype? That is, will `BeanFactory.getBean(java.lang.String)` always return independent instances?
    `boolean` | `isRunning()` Check whether this component is currently running.
    `boolean` | `isSingleton(String name)` Is this bean a shared singleton? That is, will `BeanFactory.getBean(java.lang.String)` always return the same instance?
    `boolean` | `isTypeMatch(String name, Class<?> targetType)` Check whether the bean with the given name matches the specified type.
    `protected ConfigurableListableBeanFactory` | `obtainFreshBeanFactory()` Tell the subclass to refresh the internal bean factory.
    `protected void` | `onClose()` Template method which can be overridden to add context-specific shutdown work.
    `protected void` | `onRefresh()` Template method which can be overridden to add context-specific refresh work.
    `protected void` | `postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)` Modify the application context's internal bean factory after its standard initialization.
    `protected void` | `prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)` Configure the factory's standard context characteristics, such as the context's ClassLoader and post-processors.
    `protected void` | `prepareRefresh()` Prepare this context for refreshing, setting its startup date and active flag as well as performing any initialization of property sources.
    `void` | `publishEvent(ApplicationEvent event)` Publish the given event to all listeners.
    `void` | `refresh()` Load or refresh the persistent representation of the configuration, which might an XML file, properties file, or relational database schema.
    `protected abstract void` | `refreshBeanFactory()` Subclasses must implement this method to perform the actual configuration load.
    `protected void` | `registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)` Instantiate and invoke all registered BeanPostProcessor beans, respecting explicit order if given.
    `protected void` | `registerListeners()` Add beans that implement ApplicationListener as listeners.
    `void` | `registerShutdownHook()` Register a shutdown hook with the JVM runtime, closing this context on JVM shutdown unless it has already been closed at that time.
    `void` | `setDisplayName(String displayName)` Set a friendly name for this context.
    `void` | `setEnvironment(ConfigurableEnvironment environment)` Set the `Environment` for this application context.
    `void` | `setId(String id)` Set the unique id of this application context.
    `void` | `setParent(ApplicationContext parent)` Set the parent of this application context.
    `void` | `start()` Start this component.
    `void` | `stop()` Stop this component, typically in a synchronous fashion, such that the component is fully stopped upon return of this method.
    `String` | `toString()` Return information about this context.

    - ### Methods inherited from class org.springframework.core.io.DefaultResourceLoader

      `getClassLoader, getResource, getResourceByPath, setClassLoader`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

    - ### Methods inherited from interface org.springframework.core.io.ResourceLoader

      `getClassLoader, getResource`

- - ### Field Detail

    - #### MESSAGE_SOURCE_BEAN_NAME

          public static final String MESSAGE_SOURCE_BEAN_NAME

      Name of the MessageSource bean in the factory. If none is supplied, message resolution is delegated to the parent.
      See Also:
        `MessageSource`, Constant Field Values

    - #### LIFECYCLE_PROCESSOR_BEAN_NAME

          public static final String LIFECYCLE_PROCESSOR_BEAN_NAME

      Name of the LifecycleProcessor bean in the factory. If none is supplied, a DefaultLifecycleProcessor is used.
      See Also:
        `LifecycleProcessor`, `DefaultLifecycleProcessor`, Constant Field Values

    - #### APPLICATION_EVENT_MULTICASTER_BEAN_NAME

          public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME

      Name of the ApplicationEventMulticaster bean in the factory. If none is supplied, a default SimpleApplicationEventMulticaster is used.
      See Also:
        `ApplicationEventMulticaster`, `SimpleApplicationEventMulticaster`, Constant Field Values

    - #### logger

          protected final Log logger

      Logger used by this class. Available to subclasses.

  - ### Constructor Detail

    - #### AbstractApplicationContext

          public AbstractApplicationContext()

      Create a new AbstractApplicationContext with no parent.

    - #### AbstractApplicationContext

          public AbstractApplicationContext(ApplicationContext parent)

      Create a new AbstractApplicationContext with the given parent context.
      Parameters:
        `parent` - the parent context

  - ### Method Detail

    - #### setId

          public void setId(String id)

      Set the unique id of this application context.

      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.

      Specified by:
        `setId` in interface `ConfigurableApplicationContext`
      Parameters:
        `id` - the unique id of the context

    - #### getId

          public String getId()

      Description copied from interface: `ApplicationContext`
      Return the unique id of this application context.
      Specified by:
        `getId` in interface `ApplicationContext`
      Returns:
        the unique id of the context, or `null` if none

    - #### getApplicationName

          public String getApplicationName()

      Description copied from interface: `ApplicationContext`
      Return a name for the deployed application that this context belongs to.
      Specified by:
        `getApplicationName` in interface `ApplicationContext`
      Returns:
        a name for the deployed application, or the empty String by default

    - #### setDisplayName

          public void setDisplayName(String displayName)

      Set a friendly name for this context. Typically done during initialization of concrete context implementations.

      Default is the object id of the context instance.

    - #### getDisplayName

          public String getDisplayName()

      Return a friendly name for this context.
      Specified by:
        `getDisplayName` in interface `ApplicationContext`
      Returns:
        a display name for this context (never `null`)

    - #### getParent

          public ApplicationContext getParent()

      Return the parent context, or `null` if there is no parent (that is, this context is the root of the context hierarchy).
      Specified by:
        `getParent` in interface `ApplicationContext`
      Returns:
        the parent context, or `null` if there is no parent

    - #### getEnvironment

          public ConfigurableEnvironment getEnvironment()

      Return the Environment for this application context in configurable form.

      If `null`, a new environment will be initialized via `createEnvironment()`.

      Specified by:
        `getEnvironment` in interface `ConfigurableApplicationContext`
      Specified by:
        `getEnvironment` in interface `EnvironmentCapable`

    - #### setEnvironment

          public void setEnvironment(ConfigurableEnvironment environment)

      Set the `Environment` for this application context.

      Default value is determined by `createEnvironment()`. Replacing the default with this method is one option but configuration through `getEnvironment()` should also be considered. In either case, such modifications should be performed before `refresh()`.

      Specified by:
        `setEnvironment` in interface `ConfigurableApplicationContext`
      Parameters:
        `environment` - the new environment
      See Also:
        `createEnvironment()`

    - #### getAutowireCapableBeanFactory

          public AutowireCapableBeanFactory getAutowireCapableBeanFactory()
                                                                   throws IllegalStateException

      Return this context's internal bean factory as AutowireCapableBeanFactory, if already available.
      Specified by:
        `getAutowireCapableBeanFactory` in interface `ApplicationContext`
      Returns:
        the AutowireCapableBeanFactory for this context
      Throws:
        `IllegalStateException` - if the context does not support the AutowireCapableBeanFactory interface or does not hold an autowire-capable bean factory yet (usually if `refresh()` has never been called)
      See Also:
        `getBeanFactory()`

    - #### getStartupDate

          public long getStartupDate()

      Return the timestamp (ms) when this context was first loaded.
      Specified by:
        `getStartupDate` in interface `ApplicationContext`
      Returns:
        the timestamp (ms) when this context was first loaded

    - #### publishEvent

          public void publishEvent(ApplicationEvent event)

      Publish the given event to all listeners.

      Note: Listeners get initialized after the MessageSource, to be able to access it within listener implementations. Thus, MessageSource implementations cannot publish events.

      Specified by:
        `publishEvent` in interface `ApplicationEventPublisher`
      Parameters:
        `event` - the event to publish (may be application-specific or a standard framework event)
      See Also:
        `RequestHandledEvent`

    - #### getResourcePatternResolver

          protected ResourcePatternResolver getResourcePatternResolver()

      Return the ResourcePatternResolver to use for resolving location patterns into Resource instances. Default is a `PathMatchingResourcePatternResolver`, supporting Ant-style location patterns.

      Can be overridden in subclasses, for extended resolution strategies, for example in a web environment.

      Do not call this when needing to resolve a location pattern. Call the context's `getResources` method instead, which will delegate to the ResourcePatternResolver.

      Returns:
        the ResourcePatternResolver for this context
      See Also:
        `getResources(java.lang.String)`, `PathMatchingResourcePatternResolver`

    - #### setParent

          public void setParent(ApplicationContext parent)

      Set the parent of this application context.

      Note that the parent shouldn't be changed: It should only be set outside a constructor if it isn't available when an object of this class is created, for example in case of WebApplicationContext setup.

      The parent environment is merged with this (child) application context environment if the parent is non-`null` and its environment is an instance of `ConfigurableEnvironment`.

      Specified by:
        `setParent` in interface `ConfigurableApplicationContext`
      Parameters:
        `parent` - the parent context
      See Also:
        `ConfigurableEnvironment.merge(ConfigurableEnvironment)`

    - #### addBeanFactoryPostProcessor

          public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor)

      Description copied from interface: `ConfigurableApplicationContext`
      Add a new BeanFactoryPostProcessor that will get applied to the internal bean factory of this application context on refresh, before any of the bean definitions get evaluated. To be invoked during context configuration.
      Specified by:
        `addBeanFactoryPostProcessor` in interface `ConfigurableApplicationContext`
      Parameters:
        `beanFactoryPostProcessor` - the factory processor to register

    - #### getBeanFactoryPostProcessors

          public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors()

      Return the list of BeanFactoryPostProcessors that will get applied to the internal BeanFactory.

    - #### addApplicationListener

          public void addApplicationListener(ApplicationListener<?> listener)

      Description copied from interface: `ConfigurableApplicationContext`
      Add a new ApplicationListener that will be notified on context events such as context refresh and context shutdown.

      Note that any ApplicationListener registered here will be applied on refresh if the context is not active yet, or on the fly with the current event multicaster in case of a context that is already active.

      Specified by:
        `addApplicationListener` in interface `ConfigurableApplicationContext`
      Parameters:
        `listener` - the ApplicationListener to register
      See Also:
        `ContextRefreshedEvent`, `ContextClosedEvent`

    - #### getApplicationListeners

          public Collection<ApplicationListener<?>> getApplicationListeners()

      Return the list of statically specified ApplicationListeners.

    - #### createEnvironment

          protected ConfigurableEnvironment createEnvironment()

      Create and return a new `StandardEnvironment`.

      Subclasses may override this method in order to supply a custom `ConfigurableEnvironment` implementation.

    - #### refresh

          public void refresh()
                       throws BeansException,
                              IllegalStateException

      Description copied from interface: `ConfigurableApplicationContext`
      Load or refresh the persistent representation of the configuration, which might an XML file, properties file, or relational database schema.

      As this is a startup method, it should destroy already created singletons if it fails, to avoid dangling resources. In other words, after invocation of that method, either all or no singletons at all should be instantiated.

      Specified by:
        `refresh` in interface `ConfigurableApplicationContext`
      Throws:
        `BeansException` - if the bean factory could not be initialized
        `IllegalStateException` - if already initialized and multiple refresh attempts are not supported

    - #### prepareRefresh

          protected void prepareRefresh()

      Prepare this context for refreshing, setting its startup date and active flag as well as performing any initialization of property sources.

    - #### initPropertySources

          protected void initPropertySources()

      Replace any stub property sources with actual instances.

      See Also:
        `PropertySource.StubPropertySource`, `WebApplicationContextUtils.initServletPropertySources(org.springframework.core.env.MutablePropertySources, javax.servlet.ServletContext)`

    - #### obtainFreshBeanFactory

          protected ConfigurableListableBeanFactory obtainFreshBeanFactory()

      Tell the subclass to refresh the internal bean factory.
      Returns:
        the fresh BeanFactory instance
      See Also:
        `refreshBeanFactory()`, `getBeanFactory()`

    - #### prepareBeanFactory

          protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)

      Configure the factory's standard context characteristics, such as the context's ClassLoader and post-processors.
      Parameters:
        `beanFactory` - the BeanFactory to configure

    - #### postProcessBeanFactory

          protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

      Modify the application context's internal bean factory after its standard initialization. All bean definitions will have been loaded, but no beans will have been instantiated yet. This allows for registering special BeanPostProcessors etc in certain ApplicationContext implementations.
      Parameters:
        `beanFactory` - the bean factory used by the application context

    - #### invokeBeanFactoryPostProcessors

          protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)

      Instantiate and invoke all registered BeanFactoryPostProcessor beans, respecting explicit order if given.

      Must be called before singleton instantiation.

    - #### registerBeanPostProcessors

          protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)

      Instantiate and invoke all registered BeanPostProcessor beans, respecting explicit order if given.

      Must be called before any instantiation of application beans.

    - #### initMessageSource

          protected void initMessageSource()

      Initialize the MessageSource. Use parent's if none defined in this context.

    - #### initApplicationEventMulticaster

          protected void initApplicationEventMulticaster()

      Initialize the ApplicationEventMulticaster. Uses SimpleApplicationEventMulticaster if none defined in the context.
      See Also:
        `SimpleApplicationEventMulticaster`

    - #### initLifecycleProcessor

          protected void initLifecycleProcessor()

      Initialize the LifecycleProcessor. Uses DefaultLifecycleProcessor if none defined in the context.
      See Also:
        `DefaultLifecycleProcessor`

    - #### onRefresh

          protected void onRefresh()
                            throws BeansException

      Template method which can be overridden to add context-specific refresh work. Called on initialization of special beans, before instantiation of singletons.

      This implementation is empty.

      Throws:
        `BeansException` - in case of errors
      See Also:
        `refresh()`

    - #### registerListeners

          protected void registerListeners()

      Add beans that implement ApplicationListener as listeners. Doesn't affect other listeners, which can be added without being beans.

    - #### addListener

          @Deprecated
          protected void addListener(ApplicationListener<?> listener)

      Deprecated. as of Spring 3.0, in favor of `addApplicationListener(org.springframework.context.ApplicationListener<?>)`
      Subclasses can invoke this method to register a listener. Any beans in the context that are listeners are automatically added.

      Note: This method only works within an active application context, i.e. when an ApplicationEventMulticaster is already available. Generally prefer the use of `addApplicationListener(org.springframework.context.ApplicationListener<?>)` which is more flexible.

      Parameters:
        `listener` - the listener to register

    - #### finishBeanFactoryInitialization

          protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)

      Finish the initialization of this context's bean factory, initializing all remaining singleton beans.

    - #### finishRefresh

          protected void finishRefresh()

      Finish the refresh of this context, invoking the LifecycleProcessor's onRefresh() method and publishing the `ContextRefreshedEvent`.

    - #### cancelRefresh

          protected void cancelRefresh(BeansException ex)

      Cancel this context's refresh attempt, resetting the `active` flag after an exception got thrown.
      Parameters:
        `ex` - the exception that led to the cancellation

    - #### registerShutdownHook

          public void registerShutdownHook()

      Register a shutdown hook with the JVM runtime, closing this context on JVM shutdown unless it has already been closed at that time.

      Delegates to `doClose()` for the actual closing procedure.

      Specified by:
        `registerShutdownHook` in interface `ConfigurableApplicationContext`
      See Also:
        `Runtime.addShutdownHook(java.lang.Thread)`, `close()`, `doClose()`

    - #### destroy

          public void destroy()

      DisposableBean callback for destruction of this instance. Only called when the ApplicationContext itself is running as a bean in another BeanFactory or ApplicationContext, which is rather unusual.

      The `close` method is the native way to shut down an ApplicationContext.

      Specified by:
        `destroy` in interface `DisposableBean`
      See Also:
        `close()`, `SingletonBeanFactoryLocator`

    - #### close

          public void close()

      Close this application context, destroying all beans in its bean factory.

      Delegates to `doClose()` for the actual closing procedure. Also removes a JVM shutdown hook, if registered, as it's not needed anymore.

      Specified by:
        `close` in interface `Closeable`
      Specified by:
        `close` in interface `AutoCloseable`
      Specified by:
        `close` in interface `ConfigurableApplicationContext`
      See Also:
        `doClose()`, `registerShutdownHook()`

    - #### doClose

          protected void doClose()

      Actually performs context closing: publishes a ContextClosedEvent and destroys the singletons in the bean factory of this application context.

      Called by both `close()` and a JVM shutdown hook, if any.

      See Also:
        `ContextClosedEvent`, `destroyBeans()`, `close()`, `registerShutdownHook()`

    - #### destroyBeans

          protected void destroyBeans()

      Template method for destroying all beans that this context manages. The default implementation destroy all cached singletons in this context, invoking `DisposableBean.destroy()` and/or the specified "destroy-method".

      Can be overridden to add context-specific bean destruction steps right before or right after standard singleton destruction, while the context's BeanFactory is still active.

      See Also:
        `getBeanFactory()`, `ConfigurableBeanFactory.destroySingletons()`

    - #### onClose

          protected void onClose()

      Template method which can be overridden to add context-specific shutdown work. The default implementation is empty.

      Called at the end of `doClose()`'s shutdown procedure, after this context's BeanFactory has been closed. If custom shutdown logic needs to execute while the BeanFactory is still active, override the `destroyBeans()` method instead.

    - #### isActive

          public boolean isActive()

      Description copied from interface: `ConfigurableApplicationContext`
      Determine whether this application context is active, that is, whether it has been refreshed at least once and has not been closed yet.
      Specified by:
        `isActive` in interface `ConfigurableApplicationContext`
      Returns:
        whether the context is still active
      See Also:
        `ConfigurableApplicationContext.refresh()`, `ConfigurableApplicationContext.close()`, `ConfigurableApplicationContext.getBeanFactory()`

    - #### getBean

          public Object getBean(String name)
                         throws BeansException

      Description copied from interface: `BeanFactory`
      Return an instance, which may be shared or independent, of the specified bean.

      This method allows a Spring BeanFactory to be used as a replacement for the Singleton or Prototype design pattern. Callers may retain references to returned objects in the case of Singleton beans.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `getBean` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to retrieve
      Returns:
        an instance of the bean
      Throws:
        `NoSuchBeanDefinitionException` - if there is no bean definition with the specified name
        `BeansException` - if the bean could not be obtained

    - #### getBean

          public <T> T getBean(String name,
                      Class<T> requiredType)
                    throws BeansException

      Description copied from interface: `BeanFactory`
      Return an instance, which may be shared or independent, of the specified bean.

      Behaves the same as `BeanFactory.getBean(String)`, but provides a measure of type safety by throwing a BeanNotOfRequiredTypeException if the bean is not of the required type. This means that ClassCastException can't be thrown on casting the result correctly, as can happen with `BeanFactory.getBean(String)`.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `getBean` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to retrieve
        `requiredType` - type the bean must match. Can be an interface or superclass of the actual class, or `null` for any match. For example, if the value is `Object.class`, this method will succeed whatever the class of the returned instance.
      Returns:
        an instance of the bean
      Throws:
        `NoSuchBeanDefinitionException` - if there is no such bean definition
        `BeanNotOfRequiredTypeException` - if the bean is not of the required type
        `BeansException` - if the bean could not be created

    - #### getBean

          public <T> T getBean(Class<T> requiredType)
                    throws BeansException

      Description copied from interface: `BeanFactory`
      Return the bean instance that uniquely matches the given object type, if any.
      Specified by:
        `getBean` in interface `BeanFactory`
      Parameters:
        `requiredType` - type the bean must match; can be an interface or superclass. `null` is disallowed.

        This method goes into `ListableBeanFactory` by-type lookup territory 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, use `ListableBeanFactory` and/or `BeanFactoryUtils`.

      Returns:
        an instance of the single bean matching the required type
      Throws:
        `NoSuchBeanDefinitionException` - if no bean of the given type was found
        `NoUniqueBeanDefinitionException` - if more than one bean of the given type was found
        `BeansException`
      See Also:
        `ListableBeanFactory`

    - #### getBean

          public Object getBean(String name,
                       Object... args)
                         throws BeansException

      Description copied from interface: `BeanFactory`
      Return an instance, which may be shared or independent, of the specified bean.

      Allows for specifying explicit constructor arguments / factory method arguments, overriding the specified default arguments (if any) in the bean definition.

      Specified by:
        `getBean` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to retrieve
        `args` - arguments to use if creating a prototype using explicit arguments to a static factory method. It is invalid to use a non-null args value in any other case.
      Returns:
        an instance of the bean
      Throws:
        `NoSuchBeanDefinitionException` - if there is no such bean definition
        `BeanDefinitionStoreException` - if arguments have been given but the affected bean isn't a prototype
        `BeansException` - if the bean could not be created

    - #### containsBean

          public boolean containsBean(String name)

      Description copied from interface: `BeanFactory`
      Does this bean factory contain a bean definition or externally registered singleton instance with the given name?

      If the given name is an alias, it will be translated back to the corresponding canonical bean name.

      If this factory is hierarchical, will ask any parent factory if the bean cannot be found in this factory instance.

      If a bean definition or singleton instance matching the given name is found, this method will return `true` whether the named bean definition is concrete or abstract, lazy or eager, in scope or not. Therefore, note that a `true` return value from this method does not necessarily indicate that `BeanFactory.getBean(java.lang.String)` will be able to obtain an instance for the same name.

      Specified by:
        `containsBean` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to query
      Returns:
        whether a bean with the given name is present

    - #### isSingleton

          public boolean isSingleton(String name)
                              throws NoSuchBeanDefinitionException

      Description copied from interface: `BeanFactory`
      Is this bean a shared singleton? That is, will `BeanFactory.getBean(java.lang.String)` always return the same instance?

      Note: This method returning `false` does not clearly indicate independent instances. It indicates non-singleton instances, which may correspond to a scoped bean as well. Use the `BeanFactory.isPrototype(java.lang.String)` operation to explicitly check for independent instances.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `isSingleton` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to query
      Returns:
        whether this bean corresponds to a singleton instance
      Throws:
        `NoSuchBeanDefinitionException` - if there is no bean with the given name
      See Also:
        `BeanFactory.getBean(java.lang.String)`, `BeanFactory.isPrototype(java.lang.String)`

    - #### isPrototype

          public boolean isPrototype(String name)
                              throws NoSuchBeanDefinitionException

      Description copied from interface: `BeanFactory`
      Is this bean a prototype? That is, will `BeanFactory.getBean(java.lang.String)` always return independent instances?

      Note: This method returning `false` does not clearly indicate a singleton object. It indicates non-independent instances, which may correspond to a scoped bean as well. Use the `BeanFactory.isSingleton(java.lang.String)` operation to explicitly check for a shared singleton instance.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `isPrototype` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to query
      Returns:
        whether this bean will always deliver independent instances
      Throws:
        `NoSuchBeanDefinitionException` - if there is no bean with the given name
      See Also:
        `BeanFactory.getBean(java.lang.String)`, `BeanFactory.isSingleton(java.lang.String)`

    - #### isTypeMatch

          public boolean isTypeMatch(String name,
                            Class<?> targetType)
                              throws NoSuchBeanDefinitionException

      Description copied from interface: `BeanFactory`
      Check whether the bean with the given name matches the specified type. More specifically, check whether a `BeanFactory.getBean(java.lang.String)` call for the given name would return an object that is assignable to the specified target type.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `isTypeMatch` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to query
        `targetType` - the type to match against
      Returns:
        `true` if the bean type matches, `false` if it doesn't match or cannot be determined yet
      Throws:
        `NoSuchBeanDefinitionException` - if there is no bean with the given name
      See Also:
        `BeanFactory.getBean(java.lang.String)`, `BeanFactory.getType(java.lang.String)`

    - #### getType

          public Class<?> getType(String name)
                           throws NoSuchBeanDefinitionException

      Description copied from interface: `BeanFactory`
      Determine the type of the bean with the given name. More specifically, determine the type of object that `BeanFactory.getBean(java.lang.String)` would return for the given name.

      For a `FactoryBean`, return the type of object that the FactoryBean creates, as exposed by `FactoryBean.getObjectType()`.

      Translates aliases back to the corresponding canonical bean name. Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `getType` in interface `BeanFactory`
      Parameters:
        `name` - the name of the bean to query
      Returns:
        the type of the bean, or `null` if not determinable
      Throws:
        `NoSuchBeanDefinitionException` - if there is no bean with the given name
      See Also:
        `BeanFactory.getBean(java.lang.String)`, `BeanFactory.isTypeMatch(java.lang.String, java.lang.Class<?>)`

    - #### getAliases

          public String[] getAliases(String name)

      Description copied from interface: `BeanFactory`
      Return the aliases for the given bean name, if any. All of those aliases point to the same bean when used in a `BeanFactory.getBean(java.lang.String)` call.

      If the given name is an alias, the corresponding original bean name and other aliases (if any) will be returned, with the original bean name being the first element in the array.

      Will ask the parent factory if the bean cannot be found in this factory instance.

      Specified by:
        `getAliases` in interface `BeanFactory`
      Parameters:
        `name` - the bean name to check for aliases
      Returns:
        the aliases, or an empty array if none
      See Also:
        `BeanFactory.getBean(java.lang.String)`

    - #### containsBeanDefinition

          public boolean containsBeanDefinition(String beanName)

      Description copied from interface: `ListableBeanFactory`
      Check if this bean factory contains a bean definition with the given name.

      Does not consider any hierarchy this factory may participate in, and ignores any singleton beans that have been registered by other means than bean definitions.

      Specified by:
        `containsBeanDefinition` in interface `ListableBeanFactory`
      Parameters:
        `beanName` - the name of the bean to look for
      Returns:
        if this bean factory contains a bean definition with the given name
      See Also:
        `BeanFactory.containsBean(java.lang.String)`

    - #### getBeanDefinitionCount

          public int getBeanDefinitionCount()

      Description copied from interface: `ListableBeanFactory`
      Return the number of beans defined in the factory.

      Does not consider any hierarchy this factory may participate in, and ignores any singleton beans that have been registered by other means than bean definitions.

      Specified by:
        `getBeanDefinitionCount` in interface `ListableBeanFactory`
      Returns:
        the number of beans defined in the factory

    - #### getBeanDefinitionNames

          public String[] getBeanDefinitionNames()

      Description copied from interface: `ListableBeanFactory`
      Return the names of all beans defined in this factory.

      Does not consider any hierarchy this factory may participate in, and ignores any singleton beans that have been registered by other means than bean definitions.

      Specified by:
        `getBeanDefinitionNames` in interface `ListableBeanFactory`
      Returns:
        the names of all beans defined in this factory, or an empty array if none defined

    - #### getBeanNamesForType

          public String[] getBeanNamesForType(Class<?> type)

      Description copied from interface: `ListableBeanFactory`
      Return the names of beans matching the given type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.

      NOTE: This method introspects top-level beans only. It does not check nested beans which might match the specified type as well.

      Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

      Does not consider any hierarchy this factory may participate in. Use BeanFactoryUtils' `beanNamesForTypeIncludingAncestors` to include beans in ancestor factories too.

      Note: Does not ignore singleton beans that have been registered by other means than bean definitions.

      This version of `getBeanNamesForType` matches all kinds of beans, be it singletons, prototypes, or FactoryBeans. In most implementations, the result will be the same as for `getBeanNamesOfType(type, true, true)`.

      Bean names returned by this method should always return bean names in the order of definition in the backend configuration, as far as possible.

      Specified by:
        `getBeanNamesForType` in interface `ListableBeanFactory`
      Parameters:
        `type` - the class or interface to match, or `null` for all bean names
      Returns:
        the names of beans (or objects created by FactoryBeans) matching the given object type (including subclasses), or an empty array if none
      See Also:
        `FactoryBean.getObjectType()`, `BeanFactoryUtils.beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class)`

    - #### getBeanNamesForType

          public String[] getBeanNamesForType(Class<?> type,
                                     boolean includeNonSingletons,
                                     boolean allowEagerInit)

      Description copied from interface: `ListableBeanFactory`
      Return the names of beans matching the given type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.

      NOTE: This method introspects top-level beans only. It does not check nested beans which might match the specified type as well.

      Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

      Does not consider any hierarchy this factory may participate in. Use BeanFactoryUtils' `beanNamesForTypeIncludingAncestors` to include beans in ancestor factories too.

      Note: Does not ignore singleton beans that have been registered by other means than bean definitions.

      Bean names returned by this method should always return bean names in the order of definition in the backend configuration, as far as possible.

      Specified by:
        `getBeanNamesForType` in interface `ListableBeanFactory`
      Parameters:
        `type` - the class or interface to match, or `null` for all bean names
        `includeNonSingletons` - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        `allowEagerInit` - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
      Returns:
        the names of beans (or objects created by FactoryBeans) matching the given object type (including subclasses), or an empty array if none
      See Also:
        `FactoryBean.getObjectType()`, `BeanFactoryUtils.beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)`

    - #### getBeansOfType

          public <T> Map<String,T> getBeansOfType(Class<T> type)
                                       throws BeansException

      Description copied from interface: `ListableBeanFactory`
      Return the bean instances that match the given object type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.

      NOTE: This method introspects top-level beans only. It does not check nested beans which might match the specified type as well.

      Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

      Does not consider any hierarchy this factory may participate in. Use BeanFactoryUtils' `beansOfTypeIncludingAncestors` to include beans in ancestor factories too.

      Note: Does not ignore singleton beans that have been registered by other means than bean definitions.

      This version of getBeansOfType matches all kinds of beans, be it singletons, prototypes, or FactoryBeans. In most implementations, the result will be the same as for `getBeansOfType(type, true, true)`.

      The Map returned by this method should always return bean names and corresponding bean instances in the order of definition in the backend configuration, as far as possible.

      Specified by:
        `getBeansOfType` in interface `ListableBeanFactory`
      Parameters:
        `type` - the class or interface to match, or `null` for all concrete beans
      Returns:
        a Map with the matching beans, containing the bean names as keys and the corresponding bean instances as values
      Throws:
        `BeansException` - if a bean could not be created
      See Also:
        `FactoryBean.getObjectType()`, `BeanFactoryUtils.beansOfTypeIncludingAncestors(ListableBeanFactory, Class)`

    - #### getBeansOfType

          public <T> Map<String,T> getBeansOfType(Class<T> type,
                                         boolean includeNonSingletons,
                                         boolean allowEagerInit)
                                       throws BeansException

      Description copied from interface: `ListableBeanFactory`
      Return the bean instances that match the given object type (including subclasses), judging from either bean definitions or the value of `getObjectType` in the case of FactoryBeans.

      NOTE: This method introspects top-level beans only. It does not check nested beans which might match the specified type as well.

      Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

      Does not consider any hierarchy this factory may participate in. Use BeanFactoryUtils' `beansOfTypeIncludingAncestors` to include beans in ancestor factories too.

      Note: Does not ignore singleton beans that have been registered by other means than bean definitions.

      The Map returned by this method should always return bean names and corresponding bean instances in the order of definition in the backend configuration, as far as possible.

      Specified by:
        `getBeansOfType` in interface `ListableBeanFactory`
      Parameters:
        `type` - the class or interface to match, or `null` for all concrete beans
        `includeNonSingletons` - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        `allowEagerInit` - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
      Returns:
        a Map with the matching beans, containing the bean names as keys and the corresponding bean instances as values
      Throws:
        `BeansException` - if a bean could not be created
      See Also:
        `FactoryBean.getObjectType()`, `BeanFactoryUtils.beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)`

    - #### getBeansWithAnnotation

          public Map<String,Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
                                                    throws BeansException

      Description copied from interface: `ListableBeanFactory`
      Find all beans whose `Class` has the supplied `Annotation` type.
      Specified by:
        `getBeansWithAnnotation` in interface `ListableBeanFactory`
      Parameters:
        `annotationType` - the type of annotation to look for
      Returns:
        a Map with the matching beans, containing the bean names as keys and the corresponding bean instances as values
      Throws:
        `BeansException` - if a bean could not be created

    - #### findAnnotationOnBean

          public <A extends Annotation> A findAnnotationOnBean(String beanName,
                                                      Class<A> annotationType)

      Description copied from interface: `ListableBeanFactory`
      Find a `Annotation` of `annotationType` on the specified bean, traversing its interfaces and super classes if no annotation can be found on the given class itself.
      Specified by:
        `findAnnotationOnBean` in interface `ListableBeanFactory`
      Parameters:
        `beanName` - the name of the bean to look for annotations on
        `annotationType` - the annotation class to look for
      Returns:
        the annotation of the given type found, or `null`

    - #### getParentBeanFactory

          public BeanFactory getParentBeanFactory()

      Description copied from interface: `HierarchicalBeanFactory`
      Return the parent bean factory, or `null` if there is none.
      Specified by:
        `getParentBeanFactory` in interface `HierarchicalBeanFactory`

    - #### containsLocalBean

          public boolean containsLocalBean(String name)

      Description copied from interface: `HierarchicalBeanFactory`
      Return whether the local bean factory contains a bean of the given name, ignoring beans defined in ancestor contexts.

      This is an alternative to `containsBean`, ignoring a bean of the given name from an ancestor bean factory.

      Specified by:
        `containsLocalBean` in interface `HierarchicalBeanFactory`
      Parameters:
        `name` - the name of the bean to query
      Returns:
        whether a bean with the given name is defined in the local factory
      See Also:
        `BeanFactory.containsBean(java.lang.String)`

    - #### getInternalParentBeanFactory

          protected BeanFactory getInternalParentBeanFactory()

      Return the internal bean factory of the parent context if it implements ConfigurableApplicationContext; else, return the parent context itself.
      See Also:
        `ConfigurableApplicationContext.getBeanFactory()`

    - #### getMessage

          public String getMessage(String code,
                          Object[] args,
                          String defaultMessage,
                          Locale locale)

      Description copied from interface: `MessageSource`
      Try to resolve the message. Return default message if no message was found.
      Specified by:
        `getMessage` in interface `MessageSource`
      Parameters:
        `code` - the code to lookup up, such as 'calculator.noRateSet'. Users of this class are encouraged to base message names on the relevant fully qualified class name, thus avoiding conflict and ensuring maximum clarity.
        `args` - array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), or `null` if none.
        `defaultMessage` - String to return if the lookup fails
        `locale` - the Locale in which to do the lookup
      Returns:
        the resolved message if the lookup was successful; otherwise the default message passed as a parameter
      See Also:
        `MessageFormat`

    - #### getMessage

          public String getMessage(String code,
                          Object[] args,
                          Locale locale)
                            throws NoSuchMessageException

      Description copied from interface: `MessageSource`
      Try to resolve the message. Treat as an error if the message can't be found.
      Specified by:
        `getMessage` in interface `MessageSource`
      Parameters:
        `code` - the code to lookup up, such as 'calculator.noRateSet'
        `args` - Array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), or `null` if none.
        `locale` - the Locale in which to do the lookup
      Returns:
        the resolved message
      Throws:
        `NoSuchMessageException` - if the message wasn't found
      See Also:
        `MessageFormat`

    - #### getMessage

          public String getMessage(MessageSourceResolvable resolvable,
                          Locale locale)
                            throws NoSuchMessageException

      Description copied from interface: `MessageSource`
      Try to resolve the message using all the attributes contained within the `MessageSourceResolvable` argument that was passed in.

      NOTE: We must throw a `NoSuchMessageException` on this method since at the time of calling this method we aren't able to determine if the `defaultMessage` property of the resolvable is null or not.

      Specified by:
        `getMessage` in interface `MessageSource`
      Parameters:
        `resolvable` - value object storing attributes required to properly resolve a message
        `locale` - the Locale in which to do the lookup
      Returns:
        the resolved message
      Throws:
        `NoSuchMessageException` - if the message wasn't found
      See Also:
        `MessageFormat`

    - #### getInternalParentMessageSource

          protected MessageSource getInternalParentMessageSource()

      Return the internal message source of the parent context if it is an AbstractApplicationContext too; else, return the parent context itself.

    - #### getResources

          public Resource[] getResources(String locationPattern)
                                  throws IOException

      Description copied from interface: `ResourcePatternResolver`
      Resolve the given location pattern into Resource objects.

      Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.

      Specified by:
        `getResources` in interface `ResourcePatternResolver`
      Parameters:
        `locationPattern` - the location pattern to resolve
      Returns:
        the corresponding Resource objects
      Throws:
        `IOException` - in case of I/O errors

    - #### start

          public void start()

      Description copied from interface: `Lifecycle`
      Start this component. Should not throw an exception if the component is already running.

      In the case of a container, this will propagate the start signal to all components that apply.

      Specified by:
        `start` in interface `Lifecycle`

    - #### stop

          public void stop()

      Description copied from interface: `Lifecycle`
      Stop this component, typically in a synchronous fashion, such that the component is fully stopped upon return of this method. Consider implementing `SmartLifecycle` and its `stop(Runnable)` variant in cases where asynchronous stop behavior is necessary.

      Should not throw an exception if the component isn't started yet.

      In the case of a container, this will propagate the stop signal to all components that apply.

      Specified by:
        `stop` in interface `Lifecycle`
      See Also:
        `SmartLifecycle.stop(Runnable)`

    - #### isRunning

          public boolean isRunning()

      Description copied from interface: `Lifecycle`
      Check whether this component is currently running.

      In the case of a container, this will return `true` only if all components that apply are currently running.

      Specified by:
        `isRunning` in interface `Lifecycle`
      Returns:
        whether the component is currently running

    - #### refreshBeanFactory

          protected abstract void refreshBeanFactory()
                                              throws BeansException,
                                                     IllegalStateException

      Subclasses must implement this method to perform the actual configuration load. The method is invoked by `refresh()` before any other initialization work.

      A subclass will either create a new bean factory and hold a reference to it, or return a single BeanFactory instance that it holds. In the latter case, it will usually throw an IllegalStateException if refreshing the context more than once.

      Throws:
        `BeansException` - if initialization of the bean factory failed
        `IllegalStateException` - if already initialized and multiple refresh attempts are not supported

    - #### closeBeanFactory

          protected abstract void closeBeanFactory()

      Subclasses must implement this method to release their internal bean factory. This method gets invoked by `close()` after all other shutdown work.

      Should never throw an exception but rather log shutdown failures.

    - #### getBeanFactory

          public abstract ConfigurableListableBeanFactory getBeanFactory()
                                                                  throws IllegalStateException

      Subclasses must return their internal bean factory here. They should implement the lookup efficiently, so that it can be called repeatedly without a performance penalty.

      Note: Subclasses should check whether the context is still active before returning the internal bean factory. The internal factory should generally be considered unavailable once the context has been closed.

      Specified by:
        `getBeanFactory` in interface `ConfigurableApplicationContext`
      Returns:
        this application context's internal bean factory (never `null`)
      Throws:
        `IllegalStateException` - if the context does not hold an internal bean factory yet (usually if `refresh()` has never been called) or if the context has been closed already
      See Also:
        `refreshBeanFactory()`, `closeBeanFactory()`

    - #### toString

          public String toString()

      Return information about this context.
      Overrides:
        `toString` in class `Object`