五、Spring注解:FactoryBean

本文详细介绍了Spring框架中FactoryBean接口的应用方式及其与其他普通Bean的区别。通过具体示例讲解了如何实现FactoryBean接口来定制Bean的创建过程,并展示了如何通过配置获取FactoryBean本身及由其创建的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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前面加一个‘&’。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值