一、定制 Bean 的创建过程:
-
当普通的 Bean 配置和实例化方式无法满足需求时,FactoryBean 允许你完全控制 Bean 的创建过程。例如,你可能需要在创建 Bean 之前进行一些复杂的逻辑处理,像连接数据库、从文件系统读取配置、调用远程服务等,这些操作可以在 FactoryBean 的
getObject()方法中完成。
二、封装复杂的对象创建逻辑:
-
对于一些创建过程比较复杂的对象,如代理对象(AOP 代理)、需要使用复杂构造函数的对象或需要依赖其他资源的对象,FactoryBean 可以将这些复杂的创建逻辑封装起来。
-
比如,当你使用 Spring 的 AOP 功能时,许多 AOP 代理对象是通过 FactoryBean 创建的,将 AOP 逻辑与普通 Bean 的创建逻辑分离,使代码更加清晰。
三、代码实例:
定义一个bean
@Data
public class MyBeanEntity {
private final String message = "Hello, FactoryBean!";
}
声明定义FactoryBean,用于继承FactoryBean
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class MyFactoryBean implements FactoryBean<MyBeanEntity> {
@Override
public MyBeanEntity getObject() throws Exception {
// 创建并返回 MyBean 的实例
return new MyBeanEntity();
}
@Override
public Class<?> getObjectType() {
return MyBeanEntity.class;
}
@Override
public boolean isSingleton() {
// 是否为单例,这里设置为 true
return true;
}
}
实现依赖注入
@Service
public class MyService implements InitializingBean {
@Autowired
private MyBeanEntity myBeanEntity;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(myBeanEntity);
}
}
总结:
FactoryBean 为 Spring 提供了一种强大的机制,用于灵活地创建和管理 Bean。它允许你在 Spring 容器的基础上,根据需要定制 Bean 的创建过程,封装复杂的对象创建逻辑,实现 Bean 的懒加载或预加载,以及在不改变 Spring 配置的情况下提供不同的 Bean 实现,从而提高了 Spring 应用的灵活性、可维护性和可扩展性。它是实现 Spring 高级功能,如 AOP、动态数据源等的重要基础。