Spring 入门学习 —— XML 格式文件介绍(二十五)(方法注入与方法替换 [6])

254 阅读2分钟

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

上一篇文章我们讲的是如何使用BeanFactoryAware,这篇文章我们来讲解如何使用ObjectFactoryCreatingFactoryBean 来达到与上一篇文章相同的目的。

ObjectFactoryCreatingFactoryBean 的使用

ObjectFactoryCreatingFactoryBean 是Spring 提供的一个FactoryBean 的实现,关于FactoryBean 的相关内容可以参考之前的文章。

ObjectFactoryCreatingFactoryBean 返回的是一个ObjectFactory 实例,这个实例可以为用户返回容器管理的相关对象。

其实ObjectFactoryCreatingFactoryBean 也是实现了BeanFactoryAware 接口,它所返回的ObjectFactory 实例也只是用来与Spring 容器进行交互的一个实现。而使用它的好处就在于隔离了客户端对象对FactoryFactory 的直接引用。

有了上述介绍之后,现在我们来看看如何使用ObjectFactoryCreatingFactoryBean。

首先我们来看java 的实现:

public class NewsPersister {
    private ObjectFactory objectFactory;
    public void persistNews(NewsFetchBean newsFetchBean) {
        persistNews();
    }
    public void persistNews() {
        System.out.println("persist bean is: " + getNewsFetchBean());
    }
    public NewsFetchBean getNewsFetchBean() {
        return objectFactory.getObject();
    }
    
    public void setObjectFactory(ObjectFactory objectFactory) {
        this.objectFactory = objectFactory;
    }
}

在NewsPersister 定义完成之后,我们来看一下配置文件。首先我们要有一个意识,就是应该为NewsPersister 注入ObjectFactory 实例,这就是ObjectFactoryCreatingFactoryBean 的使用精髓所在。代码如下:

<bean id = "newsFetchBean" class = "xxxxxx.NewsFetchBean" singleton = "false"/>
<bean id = "objectFactory" class = "org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name = "targetBeanName">
        <idref bean = "newsFetchBean"/>
    </property>
</bean>
<bean id = "newsPersister" class = "xxxxxx.NewsPersister">
    <property name = "objectFactory">
        <ref bean = "objectFactory"/>
    </property>
</bean>

然后,我们再次运行一下上述代码,会发现每次返回的结果都是不一致的。这就说明我们的目的达到了。

对于ObjectFactoryCreatingFactoryBean 的介绍就差不多这些,另外,我们也可以使用ServiceLocatorFactoryBean 来代替ObjectFactoryCreatingFactoryBean,这个FactoryBean 可以让我们自定义工厂接口,不需要一定使用ObjectFactory。
具体的使用读者可以自行找寻,这里就不再做叙述了。

总结

这篇文章主要是讲述如何使用ObjectFactoryCreatingFactoryBean 规避prototype 的“陷阱”。希望读者多多学习,多多记忆,多多理解,对于我们的开发及思路拓宽都是有很大的帮助的。