连载中 5/18

BeanFactory 与 FactoryBean:一个字母之差,两个世界

2026-11-04 · 55 阅读 · 0 评论 · 0 赞

面试翻车现场

问:getBean("sqlSessionFactory") 拿到的是什么?答 SqlSessionFactory 的只对了一半;追问「那怎么拿到 SqlSessionFactoryBean 本身」,一大半人卡壳——答案是个反直觉的 & 前缀。这题背后是两个名字只差一个词的接口:BeanFactory 是工厂本体,FactoryBean 是工厂里的一个特殊产品。

BeanFactory:IoC 的本体

BeanFactory 是 Spring 容器的顶层接口:getBean、containsBean、getBeanDefinition 等容器能力全在它身上。平时用的 ApplicationContext 继承自它,最终实现类是 DefaultListableBeanFactory。一句话:BeanFactory 是「造 Bean 的工厂」本身。

FactoryBean:会造 Bean 的 Bean

FactoryBean 是个特殊接口:实现它的类自己也注册为 Bean,但容器里对外暴露的不是它,而是 getObject() 返回的对象。三个方法:getObject() 产出真正的 Bean;getObjectType() 声明产出类型;isSingleton() 声明是否单例:

@Component
public class ExpensiveClientFactoryBean implements FactoryBean<ExpensiveClient> {

    @Override
    public ExpensiveClient getObject() {
        // 复杂构建:加载配置、建立连接、预热……
        return new ExpensiveClient(buildConfig(), warmUp());
    }

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

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

使用端毫无感知:getBean("expensiveClientFactoryBean") 拿到的直接是 ExpensiveClient。想见工厂本人?加 & 前缀:getBean("&expensiveClientFactoryBean")。一个符号,隔开「产品」与「车间」。

为什么需要它:给第三方框架开门

有些对象的创建复杂到没法用 @Component 声明:MyBatis 的 SqlSessionFactory 要解析全部映射文件;Mapper 接口根本没有实现类——MapperFactoryBean 的 getObject() 运行时生成动态代理(MapperProxy);Feign 的远程客户端要生成代理并接入负载均衡。FactoryBean 的意义:把任何复杂的对象创建逻辑,封装成一个标准 Spring Bean——业务代码只管按类型注入,创建黑盒留给框架自己。这是 Spring 生态各类整合方案的通用接入姿势,MyBatis-Plus、Dubbo、OpenFeign 全在用。

一句话总结

BeanFactory 造所有 Bean;FactoryBean 是「会造 Bean 的 Bean」——它产出的对象才是容器里的正主,& 前缀才能见到它本人。下一篇进入 AOP:JDK 动态代理与 CGLIB,看增强到底是怎么长出来的。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#Spring#FactoryBean#BeanFactory#MyBatis#Spring Boot

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10136 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9900 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9330 阅读 · 21 评论 · 287 赞