Java中 Spring 如何通过静态工厂方法创建 Bean

作者:袖梨 2026-07-14
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"/>
  • class 是工厂类的全限定名,不是目标 Bean 的类型
  • factory-method 是静态方法名,Spring 会直接调用它获取实例
  • 无需 constructor-argfactory-bean(那是实例工厂才用的)
  • 若静态方法需要参数,用 <constructor-arg> 传入,对应方法形参顺序和类型

@Bean 注解方式(推荐,更灵活)

在配置类中直接调用静态方法并返回对象:

立即学习“Java免费学习笔记(深入)”;

@Configurationpublic class AppConfig {    @Bean    public DataSource dataSource() {        return DataSourceFactory.createDataSource();    }}
  • 方法体就是“手动调用静态工厂”,语义明确、调试方便
  • 可自由组合参数、加日志、做条件判断
  • 支持依赖注入:方法参数可自动注入其他 Bean(如 Environment、@Value 等)

注意事项与常见问题

  • 静态工厂方法必须是 public static,否则 Spring 找不到或无法访问
  • 方法返回类型不必严格等于 Bean 声明的类型,Spring 会按实际返回值类型注册(支持向上转型)
  • 如果工厂方法抛异常,Spring 启动时会失败,并提示具体错误栈
  • XML 中不能混用 class + factory-methodfactory-bean + factory-method(后者用于实例工厂)

对比:静态工厂 vs 实例工厂

  • 静态工厂:工厂类无需 Spring 管理,方法是 static —— 用 class + factory-method
  • 实例工厂:工厂本身是 Spring Bean,方法是非静态 —— 用 factory-bean + factory-method
  • 二者都适用于封装复杂初始化逻辑,比如适配不同环境的数据源、包装第三方 SDK 客户端等

相关文章

精彩推荐