表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。,在 Spring 中,BeanFactory是 IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及创建这些对象间的依赖。BeanFactory只是个接口,并非IOC容器的具体实现,可是Spring容器给出了不少种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。BeanFactory 提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext 是 BeanFactory 的扩展,功能获得了进一步加强,好比更易与 Spring AOP 集成、消息资源处理(国际化处理)、事件传递及各类不一样应用层的 context 实现(如针对 web 应用的WebApplicationContext)。web
用的比较多的BeanFactory 的子类是ClassPathXmlApplicationContext,这是 ApplicationContext接口的一个子类,ClassPathXmlApplicationContext 从 xml 的配置文件中获取 bean 而且管理他们spring
BeanFactory和ApplicationContext就是spring框架的两个IOC容器,如今通常使用ApplicationnContext,其不但包含了BeanFactory的做用,同时还进行更多的扩展。 设计模式
BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory没法支持spring的许多插件,如AOP功能、Web应用等。ApplicationContext接口,它由BeanFactory接口派生而来,ApplicationContext包含BeanFactory的全部功能,一般建议比BeanFactory优先。ApplicationContext以一种更向面向框架的方式工做以及对上下文进行分层和实现继承。框架
通常状况下,Spring经过反射机制利用<bean>的class属性指定实现类实例化Bean,在某些状况下,实例化Bean过程比较复杂,若是按照传统的方式,则须要在<bean>中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会获得一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户能够经过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来讲占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改成FactoryBean<T>的形式ide
Spring 中为咱们提供了两种类型的 bean,一种就是普通的 bean,咱们经过 getBean(id) 方法得到是该 bean 的实际类型,另外还有一种 bean 是 FactoryBean,也就是工厂 bean,咱们经过 getBean(id)得到是该工厂所产生的 Bean 的实例,而不是该 FactoryBean 的实例。this
FactoryBean 是一个 Bean,实现了 FactoryBean 接口的类有能力改变 bean,FactoryBean 但愿你实现了它以后返回一些内容,Spring 会按照这些内容去注册 bean。不一样于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的其实是FactoryBean的getObject()返回的对象,而不是FactoryBean自己,若是要获取FactoryBean对象,请在id前面加一个&符号来获取。编码
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,全部的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式相似 spa
FactoryBean接口,提供以下方法:插件
public interface FactoryBean<T> { T getObject() throws Exception; Class<?> getObjectType(); boolean isSingleton(); }
public class StudentFactoryBean implements FactoryBean<Student> { private String name; private int age; @Override //注意getObject()返回的是由FactoryBean建立的bean实例 public Student getObject() throws Exception { return new Student(name, age); } @Override public Class<?> getObjectType() { //注意:getObjectType()返回的类型才是FactoryBean建立的真正的bean类型,类型并非StudentFactoryBean return Student.class; } /** * 工厂所管理的对象是否为单例的 * 即若是该方法返回true,那么经过getObject()方法返回的对象都是同一个对象 */ @Override public boolean isSingleton() { return true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
xml配置:设计
<bean id="studentFactoryBean" class="spring.StudentFactoryBean"> <property name="name" value="Tom"/> <property name="age" value="28"/> </bean>
使用:
public static void main(String[] args) throws Exception { BeanFactory bf = new ClassPathXmlApplicationContext("student.xml"); Student studentBean = (Student) bf.getBean("studentFactoryBean"); studentBean.print(); }