王柳 发表于 2025-10-30 06:23:06

深入明白Spring FactoryBean:机动创建复杂对象的秘密武器

弁言

  在 Spring 框架中,Bean 的创建通常由容器直接通过反射机制完成。然而,某些场景下对象的创建逻辑较为复杂(比方须要依赖外部资源、动态署理或定制化初始化流程),此时直接通过 @Bean 注解大概无法满足需求。FactoryBean 是 Spring 提供的一个强大接口,答应开发者通过编程方式控制 Bean 的创建过程。
一、什么是 FactoryBean?

  FactoryBean 是 Spring 框架中的一个接口(位于 org.springframework.beans.factory 包),用于创建复杂对象。与平常 Bean 差别,它本身是一个“工厂”,负责天生另一个 Bean 的实例。
焦点方法
public interface FactoryBean<T> {
    T getObject() throws Exception;    // 返回实际对象
    Class<?> getObjectType();          // 返回对象类型
    boolean isSingleton();             // 是否单例
}
   FactoryBean 与平常 Bean 的区别


[*]平常 Bean:容器直接实例化并管理其生命周期
[*]FactoryBean:容器会调用其 getObject() 方法返回目的对象

[*]当界说一个名为 myFactoryBean 的 FactoryBean 时,applicationContext.getBean("myFactoryBean") 返回的是 getObject() 的结果
[*]若需获取 FactoryBean 本身,需使用 applicationContext.getBean("&myFactoryBean")(名称前加 &)

二、FactoryBean 的范例使用场景


[*]集成第三方库

[*]比方 MyBatis 的 SqlSessionFactoryBean,用于创建复杂的 SqlSessionFactory 对象

[*]延长初始化与复杂逻辑

[*]当对象的创建须要读取设置、毗连数据库或盘算参数时,可通过 FactoryBean 封装逻辑

[*]动态署理天生对象

[*]比方 Spring AOP 中的 ProxyFactoryBean,用于天生署理对象

[*]同一管理资源

[*]如创建须要毗连外部服务的客户端对象(如 Redis、HTTP 客户端)

三、实战案例:自界说 FactoryBean

   假设我们须要根据设置动态创建差别品牌的 Car 对象,以下是实现步调
1. 界说目的对象
public class Car {
    private String brand;
    private int maxSpeed;
    // 省略构造方法、Getter/Setter
}
2. 实现 FactoryBean 接口
public class CarFactoryBean implements FactoryBean<Car> {
    private String brand;
    private int maxSpeed;

    // 通过属性注入配置值
    public void setBrand(String brand) { this.brand = brand; }
    public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; }

    @Override
    public Car getObject() throws Exception {
      // 复杂初始化逻辑(此处仅为示例)
      return new Car(brand, maxSpeed);
    }

    @Override
    public Class<?> getObjectType() {
      return Car.class;
    }

    @Override
    public boolean isSingleton() {
      return true; // 单例模式
    }
}
4. 注解设置方式
@Configuration
public class AppConfig {
    @Bean
    public CarFactoryBean teslaCar() {
      CarFactoryBean factory = new CarFactoryBean();
      factory.setBrand("Tesla");
      factory.setMaxSpeed(250);
      return factory;
    }
}
5. 获取 Bean
ApplicationContext context = ...;
Car car = context.getBean("teslaCar", Car.class); // 获取的是 Car 对象
FactoryBean<?> factory = context.getBean("&teslaCar", FactoryBean.class); // 获取 FactoryBean 本身
四、注意事项


[*]区分 FactoryBean 与目的 Bean

[*]使用 & 前缀获取 FactoryBean 实例本身

[*]制止重复创建

[*]若 isSingleton() 返回 true,确保 getObject() 方法每次返回同一实例

[*]与 @Primary/@Qualifier 的兼容性

[*]注解作用于 FactoryBean 天生的目的对象,而非 FactoryBean 本身

总结

  FactoryBean 是 Spring 中一种高级定制化机制,实用于复杂对象的创建场景。通过它,开发者可以机动控制 Bean 的初始化过程,实现与第三方库的无缝集成。明白其操持原理后,可明显提升对 Spring 容器内部工作机制的认识。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深入明白Spring FactoryBean:机动创建复杂对象的秘密武器