JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

二十七、Spring中的工厂方法模式深度解析

wys521 2025-03-08 01:21:34 精选教程 47 ℃ 0 评论

Spring 的工厂方法模式通过 FactoryBean 接口和多种配置方式,将对象创建逻辑抽象为可配置、可扩展的组件。它既是集成复杂第三方库的桥梁,也是实现条件化实例化的核心手段。掌握工厂方法与单例、原型模式的配合使用,能显著提升代码的灵活性和可维护性。

1. Spring 工厂方法模式的核心特点

  • 解耦对象创建:将对象创建逻辑封装在工厂方法中,调用方无需关心具体实现。
  • 动态实例化:支持通过静态方法、实例方法或 FactoryBean 接口动态生成对象。
  • 与容器集成:工厂方法由 Spring IoC 容器调用,可结合依赖注入和生命周期管理。
  • 灵活性:通过配置切换实现类(如切换数据源、日志组件)。

2. Spring 版本与源码获取

请看:
https://www.toutiao.com/article/7477754870884336178/

调试技巧

关键断点位置:
AbstractBeanFactory.createBean() → instantiateBean() →
BeanUtils.instantiateClass()。

观察 FactoryBean 接口实现类(如 SqlSessionFactoryBean)的 getObject() 方法。


3. 源码级实现剖析

FactoryBean 像一个“万能模具”,调用 getObject() 时,模具根据配置“浇铸”出特定对象(如数据库连接工厂)。

// 核心接口:FactoryBean
public interface FactoryBean {
    T getObject() throws Exception;    // 工厂方法:返回对象实例
    Class getObjectType();         // 返回对象类型
    boolean isSingleton();            // 是否单例
}

// 示例:MyBatis 的 SqlSessionFactoryBean
public class SqlSessionFactoryBean implements FactoryBean {
    @Override
    public SqlSessionFactory getObject() throws Exception {
        // 复杂初始化逻辑(如解析 XML、构建 Configuration)
        return buildSqlSessionFactory();
    }
}

4. 工厂方法的多维度应用

配置方式对比

静态工厂方法

实例工厂方法

 

注解配置

@Configuration public class AppConfig { 
  @Bean public Car tesla() { 
  	// 等同于工厂方法 
  	return CarFactory.createTesla(); 
	} 
}

FactoryBean 高级用法

@Component
public class RobotFactoryBean implements FactoryBean {
    @Override
    public Robot getObject() {
        return new Robot("AI-9000", true);
    }

    @Override
    public Class getObjectType() { return Robot.class; }

    @Override
    public boolean isSingleton() { return true; }
}

注入时区别

@Autowired Robot robot:注入 Robot 实例。

@Autowired &RobotFactoryBean:注入工厂本身(前缀 & 为 Spring 约定)。


5. 工厂模式 vs 其他创建型模式

场景

工厂方法模式

抽象工厂模式

构造器注入

创建单一对象

灵活控制实例化逻辑(如条件分支)

过度设计

简单直接

创建对象家族

需多个工厂类

统一接口生成多系列对象(如 UI 组件)

无法统一管理

与 Spring 集成

无缝结合 Bean 生命周期

可通过工厂接口实现

原生支持


6. 实际应用场景

复杂对象构建:如 MyBatis 的 SqlSessionFactory、Hibernate 的 SessionFactory。

条件化实例化:根据配置动态选择实现类。

@Bean
@Profile("dev")
public DataSource devDataSource() { /* 内存数据库 */ }

@Bean
@Profile("prod")
public DataSource prodDataSource() { /* 连接池数据库 */ }

第三方库集成:无法直接添加 @Component 注解的类(如遗留代码)。


7. 源码调试与陷阱规避

调试步骤:在
AbstractBeanFactory.getObjectForBeanInstance() 设置断点。观察工厂方法调用链路:FactoryBean.getObject() → 实际对象构造。

常见陷阱

(1)误用单例:若 FactoryBean.isSingleton()=true,多次调用 getObject() 返回同一实例。

(2)循环依赖:工厂方法中直接注入其他 Bean 可能导致循环依赖(需用 @Lazy 延迟加载)。


8. 性能与最佳实践

优点:隐藏复杂初始化逻辑(如连接池预热、XML 解析)。支持运行时动态选择实现类。

优化建议:对频繁调用的工厂方法结果缓存(结合 @Cacheable)。避免在工厂方法中执行阻塞操作(如远程调用)。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表