
Spring Boot 通过 @Bean 注解在配置类中声明工厂方法,可完全替代 XML 配置或手动工厂调用,实现接口与其实现类的解耦注入,无需额外配置类即可完成面向接口的依赖注入。
spring boot 通过 `@bean` 注解在配置类中声明工厂方法,可完全替代 xml 配置或手动工厂调用,实现接口与其实现类的解耦注入,无需额外配置类即可完成面向接口的依赖注入。
在 Spring Boot 应用中,传统 Spring Framework 的 XML 工厂配置(如
以下是一个典型实践示例:
// 1. 定义服务接口(面向抽象编程)
public interface MyService {
void doSomething();
}
// 2. 定义工厂配置类(替代 XML 或独立工厂类)
@Configuration
public class ServiceConfiguration {
@Bean
@Primary // 若存在多个 MyService Bean,此 Bean 将被默认注入
public MyService myService() {
return new MyService() {
@Override
public void doSomething() {
System.out.println("Executing service logic via factory method");
}
};
// ✅ 也可返回 Spring 管理的其他 Bean(如 new MyServiceImpl()),支持构造/Setter 注入
// ✅ 支持 @Scope、@Conditional、@Profile 等增强语义
}
}控制器中直接按接口类型注入,无需感知具体实现或工厂调用:
@Controller
public class MyController {
private final MyService myService; // 推荐使用构造器注入(更安全、可测)
public MyController(MyService myService) {
this.myService = myService;
}
public void execute() {
myService.doSomething(); // 自动调用工厂生成的实例
}
}⚠️ 关键注意事项:
- @Bean 方法必须定义在被 @Configuration 标注的类中(不能是普通 @Component),否则无法保证 CGLIB 代理与单例语义;
- 若需复用已有工厂类(如 MyServiceFactory),可将其声明为 @Bean,并在 @Bean 方法中调用其 getInstance():
@Bean public MyService myService(MyServiceFactory factory) { return factory.getInstance(); // Spring 自动注入 factory 实例 } - 避免在 @Bean 方法中硬编码复杂初始化逻辑;应优先封装至具体实现类,保持配置类职责单一;
- 对于多态场景(如不同环境返回不同实现),可结合 @Profile("dev")、@ConditionalOnProperty 等条件化注册 Bean。
总结而言,Spring Boot 并未提供专用的“工厂注入机制”,而是通过 @Bean 方法天然支持工厂模式——它既是声明式配置,也是程序化对象创建入口。开发者只需将工厂逻辑迁移至带 @Bean 注解的方法中,即可获得类型安全、容器托管、可测试、可扩展的依赖注入体验,彻底告别 XML 工厂配置与手动工厂调用。










