聊聊Spring中两种创建Bean的方式:BeanDefinition.setInstanceSupplier() 和 FactoryBean_实例化


码到三十五 :

个人主页



心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !




目录

  • 1️⃣BeanDefinition 和 FactoryBean 创建bean
  • 1.1 不同点
  • 1.2 作用
  • 1.3 使用场景和案例
  • 2️⃣ BeanDefinition创建bean
  • 3️⃣ FactoryBean 的创建bean


1️⃣BeanDefinition 和 FactoryBean 创建bean

先看下BeanDefinition 的 setInstanceSupplier() 方法和 FactoryBean 在 Spring 中有一些区别:

1.1 不同点

BeanDefinition.setInstanceSupplier() 方法是在 BeanDefinition 对象上调用的,用于设置实例的供应商(Supplier),并允许您通过编程方式提供自定义的实例化逻辑。

FactoryBean 是一个接口,用户可以实现该接口来创建具有复杂实例化逻辑的 Bean。

FactoryBean 接口定义了两个方法 getObject() 和 getObjectType(),其中 getObject() 方法用于返回所创建的 Bean 实例,getObjectType() 方法用于返回该 Bean 实例的类型。

1.2 作用

BeanDefinition.setInstanceSupplier() 方法允许您对实例化过程进行更细粒度的控制,并提供了编程式的方式来自定义实例化逻辑。
FactoryBean 具有更高级的功能。它不仅可以自定义实例化逻辑,还可以处理复杂的依赖关系、初始化逻辑、后置处理等。FactoryBean 还可以是一个代理,支持 AOP 功能。

1.3 使用场景和案例

BeanDefinition.setInstanceSupplier() 方法适用于需要灵活控制 Bean 实例化过程的场景。例如,您可能希望根据特定条件选择不同的构造函数或参数来实例化 Bean。通过使用 setInstanceSupplier() 方法,您可以编写自定义的 Supplier 实现,并在其中执行逻辑来创建 Bean 实例。

FactoryBean 适合用于创建复杂的 Bean 实例,或者需要进行额外处理的 Bean。例如,您可以使用 FactoryBean 来创建代理对象,实现 AOP 功能;或者在 getObject() 方法中执行一些初始化操作,例如读取配置文件、建立网络连接等。

2️⃣ BeanDefinition创建bean

以下是一个使用 BeanDefinition.setInstanceSupplier() 方法的示例:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
GenericBeanDefinition definition = new GenericBeanDefinition();
definition.setBeanClass(Test.class);
TestSupplier testSupplier = new TestSupplier();
definition.setInstanceSupplier(testSupplier::getuser);
ctx.registerBeanDefinition("b", definition);
ctx.refresh();
Book b = ctx.getBean("b", Test.class);
System.out.println("b = " + b);

3️⃣ FactoryBean 的创建bean

以下是一个使用 FactoryBean 的示例:

public class MyFactoryBean implements FactoryBean<MyBean> {
    @Override
    public MyBean getObject() throws Exception {
        // 自定义实例化逻辑
        return new MyBean("custom");
    }

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

在上述示例中,我们分别使用了 setInstanceSupplier() 方法和实现了 FactoryBean 接口的自定义类来创建自定义的 Bean 实例。