Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

FactoryBean

简介

可以生成指定类型的 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的实例。