Spring Boot 中不推荐直接使用 FactoryBean,优先采用 @Bean 方法;若必须使用,需实现 getObject()、getObjectType() 和 isSingleton() 三个方法,注意类型声明准确、避免未检查异常,并理解其与 @Bean 的适用场景差异。

Spring Boot 中不推荐直接使用 FactoryBean 接口来实现工厂注入,而是优先采用更简洁、类型安全的 @Bean 方法方式。但如果你确实需要或已有遗留场景依赖 FactoryBean,它仍完全可用——只是用法比传统 XML 时代更轻量,且需注意几个关键点。
FactoryBean 的基本用法
FactoryBean 是 Spring 提供的一个接口,用于封装复杂对象的创建逻辑。它有三个核心方法:
-
T getObject():返回实际要注入的 Bean 实例(如MyService) -
Class> getObjectType():声明该工厂生产的 Bean 类型(必须明确返回接口或具体类) -
boolean isSingleton():控制返回对象是否为单例(默认true)
例如:
@Component
public class MyServiceFactoryBean implements FactoryBean<myservice> {
@Override
public MyService getObject() throws Exception {
return new MyServiceImpl();
}
@Override
public Class extends MyService> getObjectType() {
return MyServiceImpl.class;
}
@Override
public boolean isSingleton() {
return true;
}
}</myservice>
此时,Spring 容器会把 MyServiceFactoryBean 当作一个“工厂”,而自动将 getObject() 返回的 MyService 实例注册为可注入的 Bean。
如何在其他组件中注入
你可以像注入普通 Bean 一样,通过 @Autowired 注入 MyService 接口类型:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
@Service
public class BusinessService {
@Autowired
private MyService myService; // ✅ 注入的是 FactoryBean.getObject() 返回的对象
}
注意:不是注入 MyServiceFactoryBean 本身,除非你显式按其实现类类型注入(如 @Autowired MyServiceFactoryBean factory),但这违背了工厂模式解耦初衷。
FactoryBean 与 @Bean 方法的区别和取舍
虽然 FactoryBean 可用,但在 Spring Boot 中它已非首选:
-
@Bean方法更直观:逻辑内联、支持条件判断、可直接注入其他 Bean、IDE 友好、调试方便 -
FactoryBean更适合需要复用工厂逻辑、或需与 Spring 内部机制深度集成的场景(如动态代理、延迟初始化包装等) - 若只是根据 profile 创建不同实现,
@Bean+@Profile或@ConditionalOnProperty更清晰
比如同样功能,@Bean 方式更推荐:
@Configuration
public class ServiceConfig {
@Bean
@Profile("prod")
public MyService myService() {
return new ProductionServiceImpl();
}
@Bean
@Profile("test")
public MyService myServiceMock() {
return new MockServiceImpl();
}
}
注意事项
使用 FactoryBean 时容易踩坑:
-
getObjectType()必须返回具体类型,不能返回Object.class,否则依赖注入会失败(类型匹配不上) - 如果工厂依赖其他 Bean(如
Environment),可在FactoryBean类上加@Component并用构造器注入,Spring 会正常解析 - 不要在
getObject()中抛出未检查异常,应捕获并转为RuntimeException,否则容器启动可能静默失败










