BeanFactory
BeanFactory是访问Spring Bean容器的根容器。
BeanFacotry是bean容器的基本客户端视图,另外,还有:ListableBeanFactory和ConfigurableBeanFactory用于具体的场景。
BeanFactory的实现类会包含一定量的bean定义,bean之间通过名字进行区分。
依赖于bean定义,BeanFactory可以返回一个独立的容器对象实例(prototype设计模式)或者单个共享实例(单例模式的高级替换)。
返回bean的类型依赖于bean factory的配置。
使用BeanFactor方式的重点在于BeanFactory是应用程序的中心注册表并且集中应用程序组建的配置。
在进行依赖注入的时候,优先使用构造器注入、setter注入(push),尽量少用lookup方式(pull方式)。
Spring的依赖注入功能的实现依赖于BeanFactory以及其子类。
BeanFactory可以支持标准bean的生命周期。完整的初始化方法及其标准顺序是:
- 1.BeanNameAware(setBeanName)
- 2.BeanClassLoaderAware(setBeanClassLoader)
- 3.BeanFactoryAware(setBeanFactory)
- 4.EnvironmentAware(setEnviroment)
- 5.EmbeddedValueResolverAware(setEmbeddedValueResolver)
- 6.ResourceLoaderAware(setResourceLoader,在使用ApplicationContext时,才会执行)
- 7.ApplicationEventPublisherAware(setApplicationEventPublisher,在使用ApplicationContext时,才会执行)
- 8.MessageSourceAware(setMessageSource,在使用ApplicationContext时,才会执行)
- 9.ApplicationContextAware(setApplicationContext,在使用ApplicationContext时,才会执行)
- 10.ServletContextAware(setServletContext,在使用ApplicationContext时,才会执行)
- 11.BeanPostProcessors(postProcessBeforeInitialization)
- 12.InitializingBean(afterPropertiesSet)
- 13.a custom init-method definition
- 14.BeanPostProcessors(postProcessAfterInitialization)
在关闭BeanFactory时,以下生命周期方式将会使用:
1.DestructionAwareBeanPostProcessors(postProcessBeforeDestruction)
2.DisposableBean(destroy)
3.a custom destroy-method definition
BeanFactory总结如下:访问Spring容器的跟接口,负责对bean的创建,访问等工作。
FactoryBean
实现FactoryBean接口之后,它将被用作公开的对象的工厂,而不是直接作为将自己公开的bean实例。
实现FactoryBean接口的类,不能被当作普通的bean。
FactoryBean是以bean的样式定义的,但是为bean引用的公开对象都是使用getObject()来创建。
FactoryBean支持singleton、prototype,并且可以在启动的时候,立即创建对象或者根据需求懒加载对象。
SmartFactoryBean接口可以暴露更多细粒度的细粒度信息。该接口在内部大量使用,仅适用于基础架构代码。
FactoryBean是一个程序化合同,在实现的时候,不依赖于注解驱动注入或者反射机制。如果想要返回其他bean,
需要实现BeanFactoryWare接口,使用变成方式获取他们。
BeanFactory vs FactoryBean
- FactoryBean是一个接口,在实现的过程中,创建的对象有Spring作为bean管理;BeanFactory作为Spring的IoC容器,它包含托管的bean以及访问的权限。BeanFactory是控制反转基本功能的基础。
- 在需要Spring管理bean的时候,就需要实现FactoryBean。BeanFactory接口不怎么常用。
- BeanFactory表示Spring容器,FactoryBean表示工厂类,其创建的对象可以被获取并且在容器中注册为bean。








网友评论