* The root interface for accessing a Spring bean container.
* This is the basic client view of a bean container;
BeanFactory接口的实现持有beanDefinitions,每个beanDefinition对象有唯一的name。根据beanDefinitaion,BeanFactory可以返回一个Prototype对象,也可能返回一个单例对象,分别对应原型设计模式和单例设计模式。自Spring2.0之后,依赖于具体的applicationContext提供了更多的scopes,如request和session在web环境中。
BeanFactory是一个应用组件的中央注册中心和把配置集中化。
使用依赖注入的方式通过setters和construnctors配置应用对象(push configuratin),要优于使用其他形式的pull configuration的方式,如BeanFactory lookup。
正常情况下,BeanFactory会从配置源中导入Bean定义,例如XML文档。从何处载入bean定义并没有限制,bean定义可存储在LDAP,RDBMS,XML,property file等。建议在Bean之间使用以来注入的机制。
BeanFactory接口的所有操作也会去检查parent BeanFactory如果是一个HierchicalBeanFactory实例的话。如果bean定义没有在当前beanfactory中找到,会去上层beanfactory中查找,子beanfactory中的bean会覆盖父beanfactory中同名的bean。
beanfactory的实现支持标准的bean lifecycle接口,初始化方法的标准顺序为:
BeanNameAware's setBeanName
BeanClassLoaderAware's setBeanClassLoader
BeanFactoryAware's setBeanFactory
EnvironmentAware's setEnvironment
EmbeddedValueResolverAware's setEmbeddedValueResolver
ResourceLoaderAware's setResourceLoader
* (only applicable when running in an application context)
ApplicationEventPublisherAware's setApplicationEventPublisher
* (only applicable when running in an application context)
MessageSourceAware's setMessageSource
* (only applicable when running in an application context)
ApplicationContextAware's setApplicationContext
* (only applicable when running in an application context)
ServletContextAware's setServletContext
* (only applicable when running in a web application context)
postProcessBeforeInitialization methods of BeanPostProcessors
InitializingBean's afterPropertiesSet
a custom init-method definition
postProcessAfterInitialization methods of BeanPostProcessors
当beanfactory shutdown时,下面的lifecycle方法会执行:
postProcessBeforeDestruction methods of DestructionAwareBeanPostProcessors
DestructionAwareBeanPostProcessors
DisposableBean's destroy
a custom destroy-method definition
BeanFactory的类结构如下: