简介
可以生成指定类型的 bean 实例。
源码
public interface FactoryBean<T> {
// 返回 bean实例
T getObject() throws Exception;
// bean实例的类型
Class<?> getObjectType();
// bean实例是否是单例模式,默认true
default boolean isSingleton() {
return true;
}
}
示例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myFactoryBean" class="mncode.MyFactoryBean"/>
</beans>
public class User {
}
public class MyFactoryBean implements FactoryBean {
@Override
public Object getObject() {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Test
public void test4() {
// 资源
ClassPathResource resource = new ClassPathResource("bean.xml");
// 创建容器
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 创建读取器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
// BeanDefinition载入和注册
reader.loadBeanDefinitions(resource);
Object o1 = factory.getBean("myFactoryBean");
System.out.println(o1.getClass());
Object o2 = factory.getBean("&myFactoryBean");
System.out.println(o2.getClass());
}
输出结果:
class mncode.User
class mncode.MyFactoryBean
说明:
通过factory.getBean("myFactoryBean")
获取的并不是MyFactoryBean
的实例,而是getObject()
中定义的User
的实例;只有当加前缀&
时,获取的才是MyFactoryBean
的实例。