Base class for ApplicationContext implementations that are supposed to support
multiple refreshs, creating a new internal bean factory instance every time.
Typically (but not necessarily), such a context will be driven by a set of
config locations to load bean definitions from.

The only method to be implemented by subclasses is loadBeanDefinitions,
which gets invoked on each refresh. A concrete implementation is supposed to load
bean definitions into the given DefaultListableBeanFactory, typically delegating
to one or more specific bean definition readers.

Note that there is a similar base class for WebApplicationContexts.
AbstractRefreshableWebApplicationContext provides the same subclassing strategy,
but additionally pre-implements all context functionality for web environments.
There is also a pre-defined way to receive config locations for a web context.

Concrete standalone subclasses of this base class, reading in a specific bean
definition format, are ClassPathXmlApplicationContext and FileSystemXmlApplicationContext,
which both derive from the common AbstractXmlApplicationContext base class.

refreshBeanFactory

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 bean factory instance that it holds. In the latter case, it will
usually throw an IllegalStateException if refreshing the context more than once.