Spring BeanFactory和FactoryBean的区别

系统管理员 2022-05-14 11:38 298阅读 0赞

有些东西可能知其用,但也需知其所以然,特转载该篇Spring BeanFactory和FactoryBean的区别

org.springframework.beansorg.springframework.context 包是 Spring IoC 容器的基础。

一、BeanFactory

BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵守的最底层和最基本的编程规范。在Spring代码中,BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactoryXmlBeanFactoryApplicationContext等,都是附加了某种功能的实现。

是一个接口,public interface BeanFactory,提供如下方法:

  1. package org.springframework.beans.factory;
  2. import org.springframework.beans.BeansException;
  3. public interface BeanFactory {
  4. String FACTORY_BEAN_PREFIX = "&";
  5. Object getBean(String var1) throws BeansException;
  6. <T> T getBean(String var1, Class<T> var2) throws BeansException;
  7. <T> T getBean(Class<T> var1) throws BeansException;
  8. Object getBean(String var1, Object... var2) throws BeansException;
  9. boolean containsBean(String var1);
  10. boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
  11. boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
  12. boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
  13. Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
  14. String[] getAliases(String var1);
  15. }

在 Spring 中,BeanFactory是 IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

BeanFactory 提供的高级配置机制,使得管理任何性质的对象成为可能。
ApplicationContextBeanFactory 的扩展,功能得到了进一步增强,比如更易与 Spring AOP 集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的 context 实现(如针对 web 应用的WebApplicationContext)。

用的比较多的 BeanFactory 的子类是 ClassPathXmlApplicationContext,这是 ApplicationContext接口的一个子类,ClassPathXmlApplicationContext从 xml 的配置文件中获取 bean 并且管理他们,例如:

  1. public static void main(String[] args) throws Exception {
  2. BeanFactory bf = new ClassPathXmlApplicationContext("student.xml");
  3. Student studentBean = (Student) bf.getBean("studentBean");
  4. studentBean.print();
  5. }

XML配置如下:

  1. <bean id="studentBean" class="advanced.Student">
  2. <property name="name" value="Tom"/>
  3. <property name="age" value="18"/>
  4. </bean>

二、FactoryBean

Spring 中为我们提供了两种类型的 bean,一种就是普通的 bean,我们通过 getBean(id) 方法获得是该 bean 的实际类型,另外还有一种 bean 是 FactoryBean,也就是工厂 bean,我们通过 getBean(id) 获得是该工厂所产生的 Bean 的实例,而不是该 FactoryBean 的实例。

FactoryBean 是一个 Bean,实现了 FactoryBean 接口的类有能力改变 bean,FactoryBean 希望你实现了它之后返回一些内容,Spring 会按照这些内容去注册 bean。
public interface FactoryBean<T>,提供如下方法:

  1. package org.springframework.beans.factory;
  2. public interface FactoryBean<T> {
  3. T getObject() throws Exception;
  4. Class<?> getObjectType();
  5. boolean isSingleton();
  6. }

通常情况下,bean 无须自己实现工厂模式,Spring 容器担任工厂 角色;但少数情况下,容器中的 bean 本身就是工厂,作用是产生其他 bean 实例。由工厂 bean 产生的其他 bean 实例,不再由 Spring 容器产生,因此与普通 bean 的配置不同,不再需要提供 class 元素。

示例:
构造一个 FactoryBean 的实现:

  1. public class StudentFactoryBean implements FactoryBean<Student> {
  2. private String name;
  3. private int age;
  4. @Override
  5. public Student getObject() throws Exception {
  6. return new Student(name, age);
  7. }
  8. @Override
  9. public Class<?> getObjectType() {
  10. return Student.class;
  11. }
  12. /** * 工厂所管理的对象是否为单例的 * 即如果该方法返回true,那么通过getObject()方法返回的对象都是同一个对象 */
  13. @Override
  14. public boolean isSingleton() {
  15. return true;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. }

XML配置如下:

  1. <bean id="studentFactoryBean" class="spring.StudentFactoryBean">
  2. <property name="name" value="Tom"/>
  3. <property name="age" value="28"/>
  4. </bean>

使用:

  1. public static void main(String[] args) throws Exception {
  2. BeanFactory bf = new ClassPathXmlApplicationContext("student.xml");
  3. Student studentBean = (Student) bf.getBean("studentFactoryBean");
  4. studentBean.print();
  5. }

本文转载自Spring BeanFactory和FactoryBean的区别

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读