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中写的一些初始化的操作。