Spring 入门学习 —— XML 格式文件介绍(十九)(工厂方法与FactoryBean [6])

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

上一篇文章的最后通过一个例子介绍了如何自定义FactoryBean,这篇文章我们来看一下如何使用。

FactoryBean 的使用

在使用这个FactoryBean 的时候,我们只需要将其注册到容器中即可,代码如下:

<bean id = "todayDateStringDisplayer" class = "xxxx.TodayDateStringDisplayer">
    <property name = "todayStringDate">
        <ref bean = "todayString"/>
    </property>
</bean>
        
<bean id = "todayString" class = "TodayStringDateFactoryBean"/>

FactoryBean 的使用理解

这个配置内容看起来和普通的bean 的定义没有什么区别,读者可能也有疑惑,我想获取的是一个String 类型的结果,但是注入的却是TodayStringDateFactoryBean 类。但是我们现在看一下TodayDateStringDisplayer 的定义:

public class TodayDateStringDisplayer {
    private String todayStringDate;
}

这里我们可以注意到,TodayDateStringDisplayer 声明依赖的todayStringDate 的类型是String,正是TodayStringDateFactoryBean 中getObject 方法(getObjectType 方法)返回的类型,而不是TodayStringDateFactoryBean 这个bean。

也就是说,实现了FactoryBean 接口的bean 的定义,通过正常操作的<bean id = "xxx"/> 的这种引用,容器所返回的内容是FactoryBean 生产出来的对象的类型,不是FactoryBean 实现类的对象本身。

这样我们就十分明确了,对比通过自定义工厂类的做法,这种实现方式简单很多。

当然,Spring 框架考虑的也十分完善,如果用户就想获取TodayStringDateFactoryBean 这个bean 本身的定义的话,可以在bean 定义的id 之前加上前缀& 来达到目的。

我们可以通过如下代码来完成上述内容的验证:

Object todayDateString = container.getBean("todayString");
assertTrue(todayDateString instanceof String);

Object todayDateStringFactoryBean = container.getBean("&todayString");
assertTrue(todayDateStringFactoryBean instanceof FactoryBean);
assertTrue(todayDateStringFactoryBean instanceof TodayStringDateFactoryBean);

在Spring 中有很多使用FactoryBean 的地方,这样在以后遇到相应的实现类之后,读者就不会再感到陌生或者不知所措了。如:

ProxyFactoryBean
TransactionProxyFactoryBean
LocalSessinFactoryBean

总结

至此关于FactoryBean 的介绍就完成了。我们可以明显地发现,FactoryBean 的使用比之前的自定义工厂方法模式简便多了。所以说,我们现在的工作都是站在“巨人”的肩膀上了完成的,如果有可能,希望我们也能完成这种工作。