รจThe org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s
IoC container.
The BeanFactory interface provides an advanced
configuration mechanism capable of managing any type of object.
It
adds easier integration with Spring’s AOP features; message resource handling
(for use in internationalization), event publication; and application-layer
specific contexts such as the WebApplicationContext for use in web applications.
The BeanFactory provides
the configuration framework and basic functionality, and the ApplicationContext adds
more enterprise-specific functionality.
In
Spring, the objects that form the backbone of your application and that are
managed by the Spring IoC container are called beans. A
bean is an object that is instantiated, assembled, and otherwise managed by a
Spring IoC container.
Otherwise,
a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.
The
BeanFactory
The BeanFactory provides the underlying basis for
Spring’s IoC functionality but it is only used directly in integration with
other third-party frameworks and is now largely historical in nature for most
users of Spring.
The BeanFactory and related interfaces, such as BeanFactoryAware, InitializingBean, DisposableBean, are still present in Spring for the purposes of backward
compatibility with the large number of third-party frameworks that integrate
with Spring.
Often third-party
components that cannot use more modern equivalents such as @PostConstruct or @PreDestroy in order to remain compatible with JDK 1.4 or to avoid a
dependency on JSR-250.
This section provides
additional background into the differences between the BeanFactory and ApplicationContext and how one might access the IoC
container directly through a classic singleton lookup.
BeanFactory or ApplicationContext?
Use an ApplicationContext unless you have a good reason for not
doing so.
Because the ApplicationContext includes all functionality of the BeanFactory, it is generally recommended
over the BeanFactory, except for a few situations such as in
embedded applications running on resource-constrained devices where memory consumption
might be critical and a few extra kilobytes might make a difference.
However, for most typical enterprise applications and systems,
the ApplicationContext is what you will want to use.
If you use only a plain BeanFactory,
a fair amount of support such as transactions and AOP will not take effect, at
least not without some extra steps on your part.
This situation could be confusing because nothing is actually
wrong with the configuration.
The following table lists features provided by the BeanFactory and ApplicationContext interfaces and implementations.
Feature
|
BeanFactory
|
Application Context
|
Bean instantiation/wiring
|
Yes
|
Yes
|
Automatic BeanPostProcessor registration
|
No
|
Yes
|
Automatic BeanFactoryPostProcessor registration
|
No
|
Yes
|
Convenient MessageSource access (for i18n)
|
No
|
Yes
|
ApplicationEvent publication
|
No
|
Yes
|
To explicitly register a bean post-processor with a BeanFactory implementation, you must write code
like this:
ConfigurableBeanFactory factory = new XmlBeanFactory(...);
// now register any needed BeanPostProcessor instances
MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();
factory.addBeanPostProcessor(postProcessor);
// now start using the factory
To explicitly register a BeanFactoryPostProcessor when using a BeanFactory implementation, you must write code
like this:
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
// bring in some property values from a Properties file
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
// now actually do the replacement
cfg.postProcessBeanFactory(factory);
In both cases, the explicit registration step is inconvenient,
which is one reason why the various ApplicationContext
implementations are preferred above plain BeanFactory implementations
in the vast majority of Spring-backed applications, especially when using BeanFactoryPostProcessors and BeanPostProcessors.
These mechanisms implement important functionality such as
property placeholder replacement and AOP.
No comments:
Post a Comment