BeanFactory介绍:
BeanFactory 是一一个类工厂,但和传统的类工厂不同,传统的类工厂仅负责构造-一个或几个类的实例:而BeanFactory 是类的通用工厂,它可以创建并管理各种类的对象。这些可被创建和管理的对象本身没有什么特别之处,仅是一个POJO, Spring称这些被创建和管理的Java对象为Bean。我们知道JavaBean是要满足一-定规范的,如必须提供-一个默认不带参的构造函数、不依赖于某-特定的容器等,但Spring中所说的Bean比JavaBean更宽泛一些, 所有可以被Spring容器实例化并管理的Java类都可以成为Bean。
1. BeanFactory的类体系结构
Spring为BeanFactory提供了多种实现,最常用的是XmlBeanFactory,但在Spring 3.2中已被废弃,
建议使用 XmlBeanDefinitionReader、DefaultListableBeanFactory替代。BeanFactory的类继承体系设计优雅,堪称经典。通过继承体系,我们可以很容易地了解到BeanFactory具有哪些功能,如图
BeanFactory接口位于类结构树的顶端,它最主要的方法就是getBean(StringbeanName),该方法从容器中返回特定名称的Bean. BeanFactory 的功能通过其他接口得到不断扩展。下面对图涉及的其他接口分别进行说明。
1、ListableBeanFactory: 该接口定义了访问容器中Bean基本信息的若干方法,如
查看Bean 的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等。
2、HierarchicalBeanFactory: 父子级联IoC容器的接口,子容器可以通过接口方法访问父容器。
3、ConfigurableBeanFactory: 这是一- 个重要的接口,增强了IoC容器的可定制性。它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法。
4、AutowireCapableBeanFactory: 定义了将容器中的Bean按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法。
5、SingletonBeanRegistry: 定义了允许在运行期向容器注册单实例Bean的方法。口BeanDefinitionRegistry: Spring配置文件中每- -个节点元素在Spring容器 里都通过一个BeanDefinition 对象表示,它描述了Bean 的配置信息。而BeanDefinition Registry接口提供了向容器手工注册BeanDefinition对象的方法。
XmlBeanDefinitionReader通过Resource 装载Spring配置信息并启动IoC容器,然后就可以通过BeanFactory#getBean(beanName)方法从 loC 容器中获取Bean。 通过BeanFactory启动loC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时。对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,.所以第二次使用getBean0获取Bean时,将直接从loC容器的缓存中获取Bean实例。
Spring在DefaultSingletonBeanRegistry类中提供了一个用于缓存单实例Bean的缓存器,它是一个用HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中。
值得一提的是,在初始化BeanFactory时,必须为其提供一种日志框架,我们使用Log4J,即在类路径下提供Log4J配置文件,这样启动Spring容器才不会报错。