Spring支持通过实例工厂方法创建Bean,即先将工厂类声明为容器管理的Bean,再调用其非静态方法生成目标Bean;XML中需配置factory-bean和factory-method,Java Config中通过@Configuration类中@Bean方法调用工厂实例方法实现。

Spring 可以通过实例工厂方法(Instance Factory Method)创建 Bean,即不使用静态工厂方法,而是先创建一个工厂对象,再调用该对象的某个非静态方法来获取目标 Bean。
配置方式:在 XML 中声明实例工厂
需要两步:先定义工厂 Bean,再通过 factory-bean 和 factory-method 指向它。
- 定义工厂类(含非静态的创建方法):
public UserService createUserService() {
return new UserServiceImpl();
}
}
- XML 配置示例:
<bean id="userService" factory-bean="userServiceFactory" factory-method="createUserService"/>
Spring 先实例化 userServiceFactory,再调用其 createUserService() 方法得到 userService Bean。
基于注解的方式(Java Config)
更推荐使用 @Configuration 类配合普通方法(非 @Bean 静态方法),利用容器管理工厂实例。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 定义工厂类和目标类:
public OrderService createOrderService() {
return new OrderServiceImpl();
}
}
- 在配置类中声明工厂 Bean 和依赖它的 Bean:
public class AppConfig {
@Bean
public OrderServiceFactory orderServiceFactory() {
return new OrderServiceFactory();
}
@Bean
public OrderService orderService() {
return orderServiceFactory().createOrderService();
}
}
注意:orderService() 方法内部调用了 orderServiceFactory(),Spring 会自动注入已管理的工厂实例(前提是该方法也被标记为 @Bean)。
关键点与注意事项
- 实例工厂本身必须是 Spring 容器管理的 Bean(不能是 new 出来的局部对象);
- 工厂方法必须是 public、非 static,且返回类型与目标 Bean 类型一致;
- 若工厂 Bean 有依赖,Spring 会自动完成注入(XML 或 Java Config 均支持);
- 工厂方法可带参数,但 XML 中需用
<constructor-arg>或<property>传参,Java Config 中直接在调用时传入。
这种方式适合需要根据工厂状态(如多租户上下文、运行时配置)动态决定返回哪个实例的场景。

















