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; } }