1.BeanDefinition和FactoryBean创建bean
在Spring框架中,BeanDefinition和FactoryBean是两种用于创建和管理Bean的重要机制。
1.1 BeanDefinition创建Bean
BeanDefinition是Spring容器在创建Bean过程中用于描述Bean的一个对象。它包含了Bean的各种属性,如类名、作用域、是否延迟初始化、依赖关系等。通过BeanDefinition,Spring容器能够知道如何实例化、配置和组装Bean。
BeanDefinition的作用:
描述Bean的各种属性和配置。 作为Spring容器创建Bean的蓝图。
BeanDefinition的创建方式:
通常通过配置文件(如XML文件)或注解来定义BeanDefinition。 在Spring容器启动时,会解析这些配置信息,并创建相应的BeanDefinition对象。
使用BeanDefinition.setInstanceSupplier()方法:
这是在BeanDefinition对象上调用的一个方法,用于设置实例的Supplier。 它允许通过编程方式提供自定义的实例化逻辑。 适用于需要灵活控制Bean实例化过程的场景。
1.2 FactoryBean创建Bean
FactoryBean是一个接口,可以实现该接口来创建具有复杂实例化逻辑的Bean。它提供了一种在Bean的创建过程中进行更多自定义操作的方式。
FactoryBean的作用:
自定义Bean的实例化逻辑。 处理复杂的依赖关系、初始化逻辑、后置处理等。 可以作为代理,支持AOP功能。
FactoryBean的创建方式:
实现FactoryBean接口,并重写其getObject()和getObjectType()方法。 在getObject()方法中编写自定义的实例化逻辑。 将实现FactoryBean接口的类注册为Spring容器中的一个Bean。
1.3 使用场景和案例
BeanDefinition.setInstanceSupplier()方法适用于需要灵活控制Bean实例化过程的场景。如,希望根据特定条件选择不同的构造函数或参数来实例化 Bean。通过使用setInstanceSupplier()方法,可以编写自定义的Supplier实现,并在其中执行逻辑来创建Bean实例。
FactoryBean适合用于创建复杂的Bean实例,或者需要进行额外处理的Bean。如,可以使用FactoryBean来创建代理对象,实现AOP功能;或者在getObject()方法中执行一些初始化操作,例如读取配置文件、建立网络连接等。
2. BeanDefinition创建bean
分别使用setInstanceSupplier()方法和实现FactoryBean接口的自定义类来创建自定义的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;
}
}
太强 ! SpringBoot中出入参增强的5种方法 : 加解密、脱敏、格式转换、时间时区处理
太强 ! SpringBoot中优化if-else语句的七种绝佳方法实战
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
SpringBoot中基于XXL-JOB实现大量数据灵活控制的分片处理方案