
Spring Boot 通过 @Bean 注解在配置类中声明工厂方法,可直接将接口实例(由工厂类创建)注册为 Spring Bean,从而实现零 XML、纯 Java 的工厂注入,天然支持 @Autowired 自动装配。
spring boot 通过 `@bean` 注解在配置类中声明工厂方法,可直接将接口实例(由工厂类创建)注册为 spring bean,从而实现零 xml、纯 java 的工厂注入,天然支持 `@autowired` 自动装配。
在传统 Spring 应用中,工厂类(Factory Class)常用于封装复杂对象的创建逻辑,尤其当目标类型是接口、且其实现类需动态决定或依赖外部条件时。Spring Boot 并未废弃这一模式,反而以更简洁、类型安全的方式进行了增强——无需 XML 配置,也无需显式定义 factory-bean 和 factory-method,只需一个 @Configuration 类 + @Bean 方法即可完成工厂注入。
核心实现方式
关键在于将工厂类的创建逻辑“升格”为 Spring 容器的 Bean 定义方法。例如,针对如下接口与工厂:
public interface MyService {
void doSomething();
}
public class MyServiceFactory {
public MyService getInstance() {
return new MyServiceImpl(); // 或根据环境/参数返回不同实现
}
}我们不直接注入 MyServiceFactory,而是在配置类中调用其工厂方法,并用 @Bean 暴露结果:
@Configuration
public class ServiceConfig {
@Bean
public MyService myService() {
return new MyServiceFactory().getInstance();
}
}此时,myService() 方法被 Spring 容器识别为一个 Bean 工厂方法,其返回值(MyService 实例)将被注册为单例 Bean(默认作用域),并可被任意组件通过 @Autowired 注入:
@Controller
public class MyController {
@Autowired
private MyService myService; // ✅ 自动注入由工厂创建的实例
public void execute() {
myService.doSomething();
}
}进阶技巧与注意事项
-
依赖传递支持:若 MyServiceFactory 本身需要其他 Bean(如 DataSource、RestTemplate),可将其声明为构造参数或 @Autowired 字段,Spring 会自动注入:
@Configuration public class ServiceConfig { @Bean public MyService myService(MyServiceFactory factory) { // factory 由容器自动注入 return factory.getInstance(); } } -
作用域控制:可通过 @Scope("prototype") 让每次注入都触发新实例创建(适用于有状态工厂):
@Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public MyService myService() { ... } 避免循环依赖:切勿在 @Bean 方法参数中引用自身(如 myService(MyService service)),否则将导致启动失败。
-
替代方案对比:
- ✅ 推荐:@Bean 工厂方法 —— 简洁、可测试、符合 Spring Boot 编程模型;
- ⚠️ 次选:@Service + @Autowired MyServiceFactory + 手动调用 getInstance() —— 失去 IoC 管理优势,不推荐用于核心服务;
- ❌ 淘汰:XML
—— 违背 Spring Boot “约定优于配置” 原则,已无必要。
综上,Spring Boot 原生支持面向接口的工厂注入,其本质是将工厂逻辑内聚于 @Bean 方法中,既保留了设计灵活性,又完全融入 Spring 的生命周期与依赖管理体系。开发者只需专注业务逻辑,无需额外配置负担。










