聊聊Spring中两种创建Bean的方式:BeanDefinition和FactoryBean

文摘   2024-10-09 19:41   广东  

1.BeanDefinition和FactoryBean创建bean

在Spring框架中,BeanDefinition和FactoryBean是两种用于创建和管理Bean的重要机制。

1.1 BeanDefinition创建Bean

BeanDefinition是Spring容器在创建Bean过程中用于描述Bean的一个对象。它包含了Bean的各种属性,如类名、作用域、是否延迟初始化、依赖关系等。通过BeanDefinition,Spring容器能够知道如何实例化、配置和组装Bean。

  1. BeanDefinition的作用

  • 描述Bean的各种属性和配置。
  • 作为Spring容器创建Bean的蓝图。
  • BeanDefinition的创建方式

    • 通常通过配置文件(如XML文件)或注解来定义BeanDefinition。
    • 在Spring容器启动时,会解析这些配置信息,并创建相应的BeanDefinition对象。
  • 使用BeanDefinition.setInstanceSupplier()方法

    • 这是在BeanDefinition对象上调用的一个方法,用于设置实例的Supplier。
    • 它允许通过编程方式提供自定义的实例化逻辑。
    • 适用于需要灵活控制Bean实例化过程的场景。

    1.2 FactoryBean创建Bean

    FactoryBean是一个接口,可以实现该接口来创建具有复杂实例化逻辑的Bean。它提供了一种在Bean的创建过程中进行更多自定义操作的方式。

    1. 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下载
    提升编程效率的利器: Google Guava库中双向映射BitMap
    从MySQL行格式原理看:为什么开发规范中不推荐NULL?数据是如何在磁盘上存储的?
    SpringBoot中使用Jackson实现自定义序列化和反序列化控制的5种方式总结
    提升编程效率的利器: Google Guava库之RateLimiter优雅限流
    深入JVM逃逸分析原理:且看其如何提高程序性能和内存利用率
    必知必会!MySQL索引下推:原理与实战

    深入解析JVM内存分配优化技术:TLAB

    SpringBoot中基于JWT的双token(access_token+refresh_token)授权和续期方案
    SpringBoot中基于JWT的单token授权和续期方案
    SpringBoot中Token登录授权、续期和主动终止的方案(Redis+Token)
    微服务中token鉴权设计的4种方式总结
    提升编程效率的API利器:精通Google Guava库区间范围映射RangeMap
    SpringBoot中Jackson控制序列化和反序列化的注解和扩展点总结【收藏版】

    SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载

    SpringBoot中基于XXL-JOB实现大量数据灵活控制的分片处理方案

    关注『 码到三十五 』,日有所获
                         点赞 和 在看 就是最大的支持

    码到三十五
    主要分享正经的开发技术(原理,架构,实践,源码等),以输出驱动输入;当然偶尔会穿插点生活琐碎,顺便吃个瓜,目的嘛,搞点精准流量,看能不能发发广告。
     最新文章