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之前加上&。