FactoryBean接口有三個方法可以重寫:
-
getObject()返回對象方法;
-
getObjectType返回對象類型
-
isSingleton()是否單例控制
1. 新建Pig類
public class Pig {
}
2. MyFactoryBean實現FactoryBean
//創建一個Spring定義的工廠bean
public class MyFactoryBean implements FactoryBean<Pig> {
//返回一個Pig對象,這個對象會添加到容器當中
@Override
public Pig getObject() throws Exception {
return new Pig();
}
@Override
public Class<?> getObjectType() {
return Pig.class;
}
//是否爲單例
@Override
public boolean isSingleton() {
return true;
}
}
3. 配置類
@Configuration
public class Cap7MainConfig {
@Bean
public MyFactoryBean myFactoryBean() {
return new MyFactoryBean();
}
}
4. 測試類
public class Cap7Test {
@Test
public void test() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap7MainConfig.class);
Object myFactoryBean = context.getBean("myFactoryBean");
Object myFactoryBean2 = context.getBean("myFactoryBean");
String className = myFactoryBean.getClass().getName();
//打印myFactoryBean返回對象的實際類名
System.out.println(className);
//判斷myFactoryBean返回的兩個對象是否爲同一個。判斷是否爲單例
System.out.println(myFactoryBean == myFactoryBean2);
String[] names = context.getBeanDefinitionNames();
for(String name : names) {
System.out.println(name);
}
}
}
結果:
Pig對象已經成功添加到容器當中,並且兩次獲取的對象地址都一樣,證明是同一個對象。下面將isSingleton 的返回值改爲false,將MyFactoryBean返回的對象改爲多例的
結果:
證明isSingleton 返回的結果生效。
5. BeanFactory和FactoryBean的區別
-
BeanFactory
BeanFactory是IOC最基本的容器,負責生產和管理bean,它爲其他具體的IOC容器提供了最基本的規範,例如DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具體的容器都是實現了BeanFactory,再在其基礎之上附加了其他的功能。
-
FactoryBean
FactoryBean是一個接口,當在IOC容器中的Bean實現了FactoryBean後,通過getBean(String BeanName)獲取到的Bean對象並不是FactoryBean的實現類對象,而是這個實現類中的getObject()方法返回的對象。要想獲取FactoryBean的實現類,就要getBean(&BeanName),在BeanName之前加上&。