Spring应用手册-FactoryBean接口

戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注

FactoryBean接口

spring应用手册(第五部分)


FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是Spring容器中的一个基本类也是很重要的一个类,在BeanFactory中可以创建和管理Spring容器中的Bean,它对于Bean的创建有一个统一的流程。
我们来看看源码:

/*
 * Copyright 2002-2018 the original author or authors.
 */
public interface FactoryBean<T> {
   /**
    * 返回当前bean工厂创建的bean的实例
    */
   @Nullable
   T getObject() throws Exception;
   /**
    * 返回当前工程创建的bean的类型
    */
   @Nullable
   Class<?> getObjectType();
   /**
    * 判断当前类是否是单利模式
    */
   default boolean isSingleton() {
      return true;
   }
}

在spring框架的底层这个创建bean的方式使用的比较多。

我们现在自己写一个案例看看它的使用方式:

我们准备一个Bean:

/**
 * @author 戴着假发的程序员
 * @company http://www.boxuewa.com
 * @description
 */
public class Coder{
    //构造方法
    public Coder(){
        System.out.println("实例化Coder对象");
    }
}

自定一个CoderFactory实现接口FactoryBean,定义泛型为Coder。默认方法isSingleton就不实现了。

/**
 * @author 戴着假发的程序员
 * @company http://www.boxuewa.com
 * @description
 */
public class CoderFactory implements FactoryBean<Coder> {
    @Override
    public Coder getObject() throws Exception {
        //手动创建Coder并且返回
        System.out.println("CoderFactory创建对象");
        return new Coder();
    }
    @Override
    public Class<Coder> getObjectType() {
        return Coder.class;
    }
}

在配置文件中进行配置,详细说明请看代码中的注释:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 使用BeanFactory方式注册Bean-->
    <!-- 这里注意,我们配置的class不是Coder而是我们的CoderFactory -->
    <bean id="coder" class="com.st.dk.demo10.factory.CoderFactory"/>
</beans>

这里一定要注意,我们的class配置的是CoderFactory,spring在加载这个类的时候,会自动检查这个类是不是FactoryBean,如果是则通过调用其getObject方法得到实例对象。

测试:

@Test
public void testFactoryBean(){
    ApplicationContext ac =
            new ClassPathXmlApplicationContext("applicationContext-demo10.xml");
    System.out.println(ac.getBean(Coder.class));
}

在这里插入图片描述
这里要注意,如果我们是使用FactoryBean的方式创建对象的,那么默认情况下spring只会创建对应的Factory对象,而不会主动调用其getObject对象进行目标对象的实例化,只有当我们从容器中获取目标对象时,spring才会调用其getObject方法创建目标对象并且返回。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴着假发的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值