BeaFactory 和 FactoryBean

BeanFactory

用于访问Spring bean容器的 root interface。他定义了bean容器最基本的公共方法; 而他的子接口,如 ListableBeanFactory 和 ConfigurableBeanFactory。 可用于特定目的。

如果对象实现了这个方法, 他会容纳一些定义好的bean,而每一个bean 通过一个字符串name作为唯一标识符。
根据bean 的定义:

  • 如果定义的是 Prototype 模式,就返回一个完全独立的对象实例。
  • 如果定义的是 singleton 模式,就返回一个共享的对象实例。也就是单例模式,共享的返回仅局限于这个被调用的factory所包含的bean中。

至于返回什么类型,会根据 bean factory 的定义来决定。而调用的API是一样的。自从spring 2.0 以后,引入了更多的范围定义,比如 web 环境下的 “request” 和 “session” 定义。

这个方法的重点在于,BeanFactory 为 application components 提供了一个集中注册和配置的地方(想想application context)。

  • “push” 方式。这是依赖注入的方式,程序里面的对象如果包含其他对象。可以通过他的构造函数,或者setter方法完成注入。而这正式spring 的依赖注入所提供的。
  • “pull” 方式。 之所以能够拿到这些bean,在于spring 使用了 BeanFactory和他的子接口的lookup 之类的方法找到了对应的类。而在实际编码中,不建议直接使用这种方法获取实例。

通常BeanFactory将根据配置源文件(例如xml文件)里面的定义加载类。然后使用 org.springframework.beans 暴力吗的方法来配置这些类。但是,实现可以直接在Java代码中直接返回它创建的Java对象。对如何存储定义,没有限制:LDAP,RDBMS,XML,属性文件等都可以。鼓励实现支持bean之间的引用(依赖注入)。

与ListableBeanFactory中的方法相比,所有的方法都是如此,如果这是一个HierarchicalBeanFactory,此接口中的操作也将检查父工厂。如果在此工厂实例中找不到bean,则会询问直接父工厂。此工厂instanc中的Bean应该在任何父工厂中覆盖同名的bean。

Bean工厂实现应尽可能支持标准bean生命周期接口。完整的初始化方法及其标准顺序是:

  • BeanNameAware.setBeanName
  • BeanClassLoaderAware.setBeanClassLoader
  • BeanFactoryAware.setBeanFactory
  • EnvironmentAware.setEnvironment
  • EmbeddedValueResolverAware.setEmbeddedValueResolver
  • ResourceLoaderAware.setResourceLoader
    下面这些,仅适用于在应用程序上下文中(application context)运行时。
  • ApplicationEventPublisherAware.setApplicationEventPublisher
  • MessageSourceAware.setMessageSource
  • ApplicationContextAware.setApplicationContext
  • ServletContextAware.setServletContext
  • BeanPostProcessors.postProcessBeforeInitialization
    还有:
  • InitializingBean.afterPropertiesSet
  • BeanPostProcessors.postProcessAfterInitialization

在bean factory 关闭的是,遵循 lifecycle 这些方法:

  • DestructionAwareBeanPostProcessors.postProcessBeforeDestruction
  • DisposableBean.destroy
  • 自定义的销毁方法

BeanFactory的所有方法:
BeanFactory

BeanFactory继承关系:
BeanFactory继承关系

FactoryBean

FactoryBean 是 BeanFactory接口实现类里面使用到的一个接口。它本身是一个工厂类,用于创建独立的对象。如果一个对象实现了这个接口,他将作为一个工厂类暴露出去,而不是直接返回工厂类所创建的实例。

一个bean实现了这个接口的画,就不能作为普通的bean类使用了。虽然FactoryBean是以bean的风格定义的,但是这个对象里面的 getObject() 方法被调用时,会返回它自己所创建的对象。

FactoryBeans 可以支持 单例(singletons) 和 原型(prototypes), 还可以创建延迟加载(lazily load) 或者在启动的时候就创建(create on startup)。SmartFactoryBean接口允许公开更细粒度的行为元数据。

这个接口在框架里面经常使用,例如 AOP 相关的 org.springframework.aop.framework.ProxyFactoryBean。 还有 org.springframework.jndi.JndiObjectFactoryBean 里面。它能够用来自定义组件(custom components)。但是,这仅适用于基础架构代码。

FactoryBean接口类的实现不同于普通的接口,它必须以代码编程的方式创建,所以:

  • 不能依赖于配置注解,完成注入。
  • 也不能使用其他反射工具。

一旦开始加载,就会调用 getObjectType() 和 getObject(). 这些调用升值早于任何 处理器的设置。如果你需要访问其他beans, 实现 BeanFactoryAware 接口,并以代码的方式获取他们。

最后,FactoryBean对象参与包含BeanFactory的bean创建同步。除了FactoryBean本身(或类似)中的延迟初始化之外,通常不需要内部同步。

这个接口有三个方法:
FactoryBean方法

他的子类和实现类有:
FactoryBean implements

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值