
Spring Boot 无需 XML 配置或显式工厂 Bean 声明,即可通过 @Bean 方法结合接口抽象,优雅实现工厂逻辑封装与自动注入。本文详解如何利用 Java Config 实现零配置、类型安全的工厂式依赖注入。
spring boot 无需 xml 配置或显式工厂 bean 声明,即可通过 `@bean` 方法结合接口抽象,优雅实现工厂逻辑封装与自动注入。本文详解如何利用 java config 实现零配置、类型安全的工厂式依赖注入。
在 Spring Boot 应用中,传统 XML 中的
✅ 推荐实践:用 @Bean 方法替代工厂类实例
不再需要单独定义 MyServiceFactory 类并将其注册为 Bean,而是将工厂逻辑直接写入 @Bean 方法体内。该方法返回接口类型,Spring 自动将其注册为可注入的 Bean:
@Configuration
public class ServiceConfig {
@Bean
public MyService myService() {
// 工厂逻辑内联:支持条件判断、参数注入、多态选择等
if (isProduction()) {
return new ProductionServiceImpl();
} else {
return new MockServiceImpl();
}
}
private boolean isProduction() {
return "prod".equalsIgnoreCase(
Environment.getProperty("spring.profiles.active", "dev")
);
}
}此时,任何依赖 MyService 的组件均可直接 @Autowired,无需感知工厂存在:
@Controller
public class MyController {
private final MyService myService; // 推荐使用构造器注入
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/action")
public String execute() {
myService.doSomething();
return "success";
}
}⚠️ 注意事项与最佳实践
- 避免冗余工厂类:除非工厂本身需复用、有复杂生命周期管理(如池化、状态缓存),否则不建议单独定义 MyServiceFactory 类——它会增加间接层,违背 Spring Boot “约定优于配置”的设计哲学。
- 优先构造器注入:示例中使用构造器注入而非字段注入,确保依赖不可变且便于单元测试。
- @Bean 方法名即 Bean 名称:方法名 myService() 默认注册为名为 myService 的 Bean;如需自定义名称,可用 @Bean("customName")。
- 支持依赖注入到工厂方法中:myService() 方法参数可声明其他 @Bean(如 DataSource、RestTemplate),Spring 会自动解析并注入,实现工厂逻辑与上下文深度集成。
-
若必须保留工厂类:可通过 @Bean 显式调用其方法(非推荐):
@Bean public MyService myService() { return new MyServiceFactory().getInstance(); // 仅当工厂含必要状态/初始化逻辑时考虑 }
✅ 总结
Spring Boot 的 @Bean 方法本质就是“声明式工厂”——它比 XML 更直观,比传统工厂类更轻量,且天然支持依赖注入、条件化装配与环境感知。开发者应摒弃“必须先写工厂类再注入”的思维定式,转而将创建逻辑直接提升为容器级契约。这不仅简化代码结构,更强化了 Spring 的控制反转本质:对象的创建权始终由容器掌握,而工厂逻辑只是容器内部的策略表达。










