FactoryBean也可以算是容器扩展的一部分。当需要对一个bean进行复杂的初始化,可以考虑用FactoryBean。
FactoryBean接口提供了三个方法:
如果想要对象本身,就在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本身。