Skip to content

FactoryBean

FactoryBean 是 Spring 框架中的一个 特殊 Bean 接口,它不是用来表示一个普通的 Bean, 而是用来生产Bean的工厂。你可以通过它来自定义创建某个 Bean 的方式。

🧠 简单理解

通常我们定义的类(比如 UserService)是直接作为 Bean 注入的,但当你实现了 FactoryBean<T> 接口,这个类本身不会作为 Bean 注入, 而是用它的 getObject() 方法返回的对象才是最终注入容器的 真正 Bean

📦 常见场景

场景用途
复杂对象的创建如动态代理、反射、第三方库对象等
需要延迟加载控制实例化时机或初始化逻辑
框架级封装比如 MyBatis 的 MapperFactoryBean、Spring AOP、Spring Data 等都用它

🧩 接口定义

java
public interface FactoryBean<T> {
    T getObject() throws Exception;             // 返回实际要注入容器的 Bean 实例
    Class<?> getObjectType();                   // 返回 getObject() 返回对象的类型
    boolean isSingleton();                      // 是否是单例(容器中是否只创建一个 getObject 的实例)
}

✅ 示例

👇 假设你有一个特殊的 Bean 想手动控制实例化:

java
public class MyConnection {
    public MyConnection() {
        System.out.println("MyConnection 初始化");
    }
}

👇 写一个 FactoryBean 来控制它的创建:

java
public class MyConnectionFactoryBean implements FactoryBean<MyConnection> {
    @Override
    public MyConnection getObject() {
        System.out.println("通过 FactoryBean 创建 MyConnection 实例");
        return new MyConnection();
    }

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

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

👇 在配置类中注册:

java
@Configuration
public class AppConfig {
    @Bean
    public MyConnectionFactoryBean myConnectionFactoryBean() {
        return new MyConnectionFactoryBean();
    }
}

❗️取 Bean 的时候注意:

java
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

// 获取工厂创建的 Bean(MyConnection)
MyConnection conn = ctx.getBean("myConnectionFactoryBean", MyConnection.class);

// 如果你想获取工厂本身,要加 "&"
Object factory = ctx.getBean("&myConnectionFactoryBean");

🏗️ Spring 内部常用的 FactoryBean 示例:

案例用途
ProxyFactoryBean用于 AOP 动态代理
SqlSessionFactoryBeanMyBatis 用于创建 SqlSessionFactory
MapperFactoryBeanMyBatis 中创建 Mapper 接口代理类
LocalContainerEntityManagerFactoryBeanJPA 中 EntityManagerFactory 的创建
ServiceLocatorFactoryBean实现服务定位模式的工厂

✅ 总结

特点描述
是一个工厂实现了 FactoryBean<T> 接口的类,其返回的是 T 类型的对象
可以控制 Bean 的创建方式用于创建复杂或第三方组件对象
默认是单例可以通过 isSingleton() 控制是否每次都创建新对象