乐趣区

spring学习之FactoryBean

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

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

如果想要对象本身,就在 getbean 的时候,前面加个 &。
MyFactoryBean

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();
    }
}

测试代码

@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);
}

运行结果如下:

如果直接调用 app.getBean(“myFactoryBean”),返回的类型是 getObjectType 这个方法返回的类型,返回的对象是 getObject 返回的对象,与实现的接口有关。
如果直接调用 app.getBean(“&myFactoryBean”),那返回的类型就是 MyFactoryBean。
因为 isSingleton 返回的是 false,所以 app.getBean(“myFactoryBean”) 得到的两次结果是不一样的,app.getBean(“&myFactoryBean”) 得到的结果是一样的,他们都返回 myFactoryBeanbean 本身。

退出移动版