spring学习之FactoryBean

FactoryBean也能够算是容器扩展的一部分。当须要对一个bean进行复杂的初始化,能够考虑用FactoryBean。
FactoryBean接口提供了三个方法:app

  1. Object getObject():返回对象的实例。
  2. boolean isSingleton():是否单例。
  3. Class getObjectType():返回对象的类型。

若是想要对象自己,就在getbean的时候,前面加个&。
MyFactoryBeanide

public class MyFactoryBean implements FactoryBean {
    @Override
    public MyBean getObject() throws Exception {
        return new MyBean();
    }

    @Override
    public Class<?> getObjectType() {
        return MyBean.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

MyConfig测试

@Configuration
public class MyConfig {
    @Bean
    public MyFactoryBean myFactoryBean() {
        return new MyFactoryBean();
    }
}

测试代码spa

@Test
public void test(){
    ApplicationContext app =  new AnnotationConfigApplicationContext(MyConfig.class);
    Object myBean = app.getBean("myFactoryBean");
    Object myBean2 = app.getBean("myFactoryBean");
    Object myFactoryBean = app.getBean("&myFactoryBean");
    Object myFactoryBean2 = app.getBean("&myFactoryBean");
    System.out.println(myBean);
    System.out.println(myBean2);
    System.out.println(myFactoryBean);
    System.out.println(myFactoryBean2);
}

运行结果以下:
image.png
若是直接调用app.getBean("myFactoryBean"),返回的类型是getObjectType这个方法返回的类型,返回的对象是getObject返回的对象,与实现的接口有关。
若是直接调用app.getBean("&myFactoryBean"),那返回的类型就是MyFactoryBean。
由于isSingleton返回的是false,因此app.getBean("myFactoryBean")获得的两次结果是不同的,app.getBean("&myFactoryBean")获得的结果是同样的,他们都返回myFactoryBeanbean自己。code

相关文章
相关标签/搜索