Spring FactoryBean特性和使用

1 FactoryBean简介

FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。

用于配置复杂的Bean对象,可以将创建过程存储在FactoryBean 的getObject方法!

FactoryBean<T> 接口提供三种方法:

  • T getObject():

    返回此工厂创建的对象的实例。该返回值会被存储到IoC容器!

  • boolean isSingleton():

    如果此 FactoryBean 返回单例,则返回 true ,否则返回 false 。此方法的默认实现返回 true (注意,lombok插件使用,可能影响效果)。

  • Class<?> getObjectType(): 返回 getObject() 方法返回的对象类型,如果事先不知道类型,则返回 null
    在这里插入图片描述

2 FactoryBean使用场景

  1. 代理类的创建
  2. 第三方框架整合
  3. 复杂对象实例化等

3 Factorybean应用

  1. 准备FactoryBean实现类
public class HappyMachine {
    private String machineName;

    public String getMachineName() {
        return machineName;
    }

    public void setMachineName(String machineName) {
        this.machineName = machineName;
    }
}
 // 实现FactoryBean接口时需要指定泛型
      // 泛型类型就是当前工厂要生产的对象的类型
      public class HappyFactoryBean implements FactoryBean<HappyMachine> {
          
          private String machineName;
          
          public String getMachineName() {
              return machineName;
          }
          
          public void setMachineName(String machineName) {
              this.machineName = machineName;
          }
          
          @Override
          public HappyMachine getObject() throws Exception {
          
              // 方法内部模拟创建、设置一个对象的复杂过程
              HappyMachine happyMachine = new HappyMachine();
          
              happyMachine.setMachineName(this.machineName);
          
              return happyMachine;
          }
          
          @Override
          public Class<?> getObjectType() {
          
              // 返回要生产的对象的类型
              return HappyMachine.class;
          }
      }
  1. 配置FactoryBean实现类
 <!-- FactoryBean机制 -->
      <!-- 这个bean标签中class属性指定的是HappyFactoryBean,但是将来从这里获取的bean是HappyMachine对象 -->
      <bean id="happyMachine" class="com.lx.ioc_05.HappyFactoryBean">
          <!-- property标签仍然可以用来通过setXxx()方法给属性赋值 -->
          <property name="machineName" value="iceCreamMachine"/>
      </bean>
  1. 测试读取FactoryBean和FactoryBean.getObject对象
 @Test
      public void testExperiment()  {
      
          ApplicationContext iocContainer = new ClassPathXmlApplicationContext("spring-05.xml");
      
          //注意: 直接根据声明FactoryBean的id,获取的是getObject方法返回的对象
          HappyMachine happyMachine = iocContainer.getBean("happyMachine",HappyMachine.class);
          System.out.println("happyMachine = " + happyMachine);
      
          //如果想要获取FactoryBean对象, 直接在id前添加&符号即可!  &happyMachine7 这是一种固定的约束
          Object bean = iocContainer.getBean("&happyMachine7");
          System.out.println("bean = " + bean);
      }

4 FactoryBean和BeanFactory区别

FactoryBean 是 Spring 中一种特殊的 bean,可以在 getObject() 工厂方法自定义的逻辑创建Bean!是一种能够生产其他 Bean 的 Bean。FactoryBean 在容器启动时被创建,而在实际使用时则是通过调用 getObject() 方法来得到其所生产的 Bean。因此,FactoryBean 可以自定义任何所需的初始化逻辑,生产出一些定制化的 bean。

一般情况下,整合第三方框架,都是通过定义FactoryBean实现!!!

BeanFactory 是 Spring 框架的基础,其作为一个顶级接口定义了容器的基本行为,例如管理 bean 的生命周期、配置文件的加载和解析、bean 的装配和依赖注入等。BeanFactory 接口提供了访问 bean 的方式,例如 getBean() 方法获取指定的 bean 实例。它可以从不同的来源(例如 Mysql 数据库、XML 文件、Java 配置类等)获取 bean 定义,并将其转换为 bean 实例。同时,BeanFactory 还包含很多子类(例如,ApplicationContext 接口)提供了额外的强大功能。

总的来说,FactoryBean 和 BeanFactory 的区别主要在于前者是用于创建 bean 的接口,它提供了更加灵活的初始化定制功能,而后者是用于管理 bean 的框架基础接口,提供了基本的容器功能和 bean 生命周期管理。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值