spring可通过静态工厂方法创建bean,需在xml中配置class为工厂类、factory-method指定静态方法名,或用@bean注解直接调用静态方法;静态工厂无需实例化,而实例工厂需通过factory-bean引用已托管的工厂bean。

Spring 可以通过静态工厂方法创建 Bean,关键在于配置中指定 class 为工厂类,并用 factory-method 指定静态方法名,不配置 constructor-arg 给工厂本身(因为是静态的,无需实例化工厂)。
XML 配置方式(传统但清晰)
假设有一个静态工厂类:
public class DataSourceFactory {
public static DataSource createDataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:h2:mem:test");
ds.setUsername("sa");
return ds;
}
}
在 Spring XML 中这样声明 Bean:
<bean id="dataSource" class="com.example.DataSourceFactory" factory-method="createDataSource"></bean>
- class 是工厂类的全限定名,不是目标 Bean 的类型
- factory-method 是静态方法名,Spring 会直接调用它获取实例
- 无需
constructor-arg或factory-bean(那是实例工厂才用的) - 若静态方法需要参数,用
<constructor-arg></constructor-arg>传入,对应方法形参顺序和类型
@Bean 注解方式(推荐,更灵活)
在配置类中直接调用静态方法并返回对象:
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return DataSourceFactory.createDataSource();
}
}
- 方法体就是“手动调用静态工厂”,语义明确、调试方便
- 可自由组合参数、加日志、做条件判断
- 支持依赖注入:方法参数可自动注入其他 Bean(如 Environment、@Value 等)
注意事项与常见问题
- 静态工厂方法必须是 public static,否则 Spring 找不到或无法访问
- 方法返回类型不必严格等于 Bean 声明的类型,Spring 会按实际返回值类型注册(支持向上转型)
- 如果工厂方法抛异常,Spring 启动时会失败,并提示具体错误栈
- XML 中不能混用
class+factory-method和factory-bean+factory-method(后者用于实例工厂)
对比:静态工厂 vs 实例工厂
- 静态工厂:工厂类无需 Spring 管理,方法是 static —— 用
class+factory-method - 实例工厂:工厂本身是 Spring Bean,方法是非静态 —— 用
factory-bean+factory-method - 二者都适用于封装复杂初始化逻辑,比如适配不同环境的数据源、包装第三方 SDK 客户端等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











