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继承关系:
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本身(或类似)中的延迟初始化之外,通常不需要内部同步。
这个接口有三个方法:
他的子类和实现类有: