spring中的Bean有两种,一种是很普通的bean,比如使用@Bean注解得到的bean。

@Bean
    public Person person(){
        return new Person("wangwu",22);
    }

然后在BeanFactory中根据id ‘person’ 获取bean的时候,得到的对象就是就是Person类型的。

还有一种就是实现了org.springframework.beans.factory.FactoryBean接口的Bean,那么在从BeanFactory中根据定义的id获取bean的时候,获取的实际上是FactoryBean接口中的getObject()方法返回的对象。

接口实现类:

StudentFactoryBean就是一个实现了FactoryBean接口的实现类,可以看出实现类中有三个方法,其中每个方法都有各自的解释。

public class StudentFactoryBean implements FactoryBean<Student> {

    // 返回一个Student对象 这个对象会添加到容器中去
    public Student getObject() throws Exception {
        System.out.println("StudentFactoryBean ... getObject ... ");
        return new Student();
    }

    // 返回泛型的类型
    public Class<?> getObjectType() {
        return Student.class;
    }

    //是否是单例
    // true bean是单例 容器中唯一
    // false 多实例
    public boolean isSingleton() {
        return true;
    }
}

配置类:FactoryBeanConfig

和普通的POJO对象一样,可以使用@Bean注解将实现了FactoryBean接口的实现类注册到容器中去。

@Configuration
public class FactoryBeanConfig {

    @Bean
    public StudentFactoryBean studentFactoryBean(){
        return new StudentFactoryBean();
    }
}

测试类:

@Test
    void test07() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);
        String[] names = ac.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        Object ob = ac.getBean("studentFactoryBean");
        System.out.println(ob.getClass());

        Object ob2 = ac.getBean("studentFactoryBean");
        System.out.println(ob == ob2);

        Object ob3 = ac.getBean("&studentFactoryBean");
        System.out.println(ob3.getClass());

    }

结果:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
factoryBeanConfig
studentFactoryBean
StudentFactoryBean ... getObject ... 
class com.baiding.model.Student
true
class com.baiding.model.StudentFactoryBean
首先从结果可以看出:
1. 输出的beanName中有一个叫studentFactoryBean的组件,然而这个组件的class为com.baiding.model.Student,从中可以得到,实现了FactoryBean接口的实现类,在容器中默认获取得到的是工厂bean调用getObject方法创建的对象。
2. 在判断ob这个对象是否ob2这个对象相等时,输出的是true,同时,在studentFactoryBean这个实现类getObject方法中输出的字符串‘StudentFactoryBean … getObject …’只输出了一次,可以看出单实例生效。
3. 在测试类中有一行代码是‘ac.getBean(“&studentFactoryBean”);’,注意这个&号,得到的对象类型输出之后可以看出是工厂Bean本身的类型,即要获取工厂bean本身,我们需要在id前面加一个‘&’。