FactoryBean和BeanFactory

前言:

    这是一个很容易被问到的关于Spring的面试题。

    两个特别像,但是功能却千差万别。

    有关于BeanFactory,我们都知道,这是Spring容器的基础实现类,它负责生产和管理Bean的一个工厂。当然BeanFactory只是一个接口,它的常用实现有XmlBeanFactory、DefaultListableBeanFactory、ApplicationContext等。

FactoryBean和BeanFactory_第1张图片

    那么今天的重点来了,什么是FactoryBean呢?

 

1.FactoryBean

    FactoryBean是一个接口,具体方法如下:

public interface FactoryBean {

	T getObject() throws Exception;

	Class getObjectType();

	boolean isSingleton();
}

    它的作用是什么呢,使用在哪些场景呢?Spring官方文档中给出了答案

If you have complex initialization code that is better expressed in Java as opposed to a (potentially) verbose amount of XML, you can create your own FactoryBean, write the complex initialization inside that class, and then plug your custom FactoryBean into the container.

    简单表达就是:我们常规的Bean都是使用Class的反射获取具体实例,如果Bean的获取过程比较复杂,那么常规的xml配置需要配置大量属性值,这个时候我们就可以使用FactoryBean,实现这个接口,在其getObject()方法中初始化这个bean。

    话不多说,下面用一个示例来展示一下其用法

 

2.FactoryBean示例

    1.创建一个StudentFactoryBean

public class StudentFactoryBean implements FactoryBean {

    @Override
    public Object getObject() throws Exception {

        Student student = new Student();
        student.setAge(22);
        student.setName("jj");
        student.setId(10);
        
        return student;
    }

    // 对象具体类型
    @Override
    public Class getObjectType() {
        return Student.class;
    }

    // 是否单例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

    2.在SpringConfiguration中添加该bean

@Configuration
public class SpringConfiguration {
    @Bean
    public StudentFactoryBean studentFactoryBean(){
        return new StudentFactoryBean();
    }
}

    3.测试

@Test
public void testStudentFactoryBean(){
    AnnotationConfigApplicationContext applicationContext
        = new AnnotationConfigApplicationContext(SpringConfiguration.class);

    Student student = (Student) applicationContext.getBean("studentFactoryBean");
    System.out.println(student);
}

// res
Student(id=10, name=test:jj, age=22)

    总结:成功的调用了StudentFactoryBean.getObject()方法

 

3.总结FactoryBean和BeanFactory

    BeanFactory:工厂类接口,Spring容器的核心接口,实例化bean、配置bean之间的依赖关系

    FactoryBean:实例化bean过程比较复杂时可以考虑使用

 

参考:

https://docs.spring.io/spring/docs/4.3.23.RELEASE/spring-framework-reference/htmlsingle/ 

代码地址:https://github.com/kldwz/springstudy  

 

 

 

 

你可能感兴趣的:(Spring,跟着Spring官方文档学习)