FactoryBean接口作用

FactoryBean是一个生产Bean产品的工厂,它是一个接口,只要实现了这个接口就可以生产Bean.

java 复制代码
package com.xuecheng.content.a01;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/8/27 22:29
 */
@Slf4j
@Component("bean1")
public class MyFactoryBean implements FactoryBean {
    //提供产品对象
    @Override
    public Object getObject() throws Exception {
        Bean1 bean1 = new Bean1();
        log.debug("creating bean: {}",bean1);
        return bean1;
    }
    //决定了根据类型获取或依赖注入能否成功
    @Override
    public Class<?> getObjectType() {
        return Bean1.class;
    }

    @Override
    public boolean isSingleton() {
        //单例
        return true;
    }
}

实现这个接口需要重写上面三个方法。

1.getObject()返回实体

2.getObjectType()返回实体的类型

3.isSingleton()决定生产的Bean对象是否是单例

对FactoryBean类进行测试:

首先创建Bean1

java 复制代码
package com.xuecheng.content.a01;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/8/27 22:30
 */
@Slf4j
public class Bean1 implements BeanFactoryAware {
    private Bean2 bean2;
    @Autowired
    public void setBean2(Bean2 bean2){
        this.bean2 = bean2;
    }
    public Bean2 getBean2(){return bean2;}
    @PostConstruct
    public void init(){log.debug("init");}

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        log.debug("setBeanFactory{}",beanFactory);
    }
}

Bean1(没有被Spring管理)里面依赖了Bean2,并把Bean2交给Spring管理,方便后期测试,同时实现BeanFactoryAware 接口,设置Bean1的BeanFactory。

java 复制代码
package com.xuecheng.content.a01;

import org.springframework.stereotype.Component;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/8/27 22:35
 */
@Component
public class Bean2 {
}
java 复制代码
package com.xuecheng.content.a01;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/8/27 22:49
 */
@ComponentScan
public class TestFactoryBean {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestFactoryBean.class);
       Bean1 bean1 = (Bean1) context.getBean("bean1");
        System.out.println(bean1);
        context.close();
    }
}

把测试类交给Spring管理,我们通过容器获取名字为bean1的bean。容器从BeanFactory里面拿到了bean1。

测试结果:

Bean1被创建,但是没有做Bean1中写的一些初始化的操作。