聊聊Spring中两种创建Bean的方式:BeanDefinition.setInstanceSupplier() 和 FactoryBean

简介: 聊聊Spring中两种创建Bean的方式:BeanDefinition.setInstanceSupplier() 和 FactoryBean

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;
    }
}
相关文章
|
11天前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
15 2
|
11天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3
|
2天前
|
Java Spring
Spring的BeanPostProcessor后置处理器与bean的生命周期
Spring的BeanPostProcessor后置处理器与bean的生命周期
|
2天前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
7 1
|
3天前
|
Java Spring 容器
解读spring5源码中实例化单例bean的调用链
解读spring5源码中实例化单例bean的调用链
|
6天前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
13 2
|
11天前
|
Java 开发者 Spring
Spring 中 Bean 的生命周期
Spring 中 Bean 的生命周期
12 2
|
1月前
|
Java 容器 Spring
Spring的加载配置文件、容器和获取bean的方式
Spring的加载配置文件、容器和获取bean的方式
30 3
Spring的加载配置文件、容器和获取bean的方式
|
1月前
|
Java Spring 容器
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
35 1
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
|
18天前
|
Java Spring
解决 Spring 中 Prototype Bean 注入后被固定的问题
【6月更文挑战第8天】学习 Spring 框架内不原理的意义就是,当遇到问题时,分析出原因,就可以从多个切入点,利用 Spring 的特性,来解决问题。
29 2