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

82 阅读2分钟

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

上一篇文章是为了在引入方法注入和方法替换之前做知识铺垫,这篇文章我们继续介绍其他知识。

问题的引入

按照之前的定义,我们将NewsFetchBean 注册到容器中之后,因为它的“有状态类型”的特点,所以说,每个新闻用来获取新闻的bean 都是一个独立的个体。

有了获取新闻的bean 之后,我们再给出持久化新闻的类NewsPersister。这个类存在的意义就是为了查验注入NewsFetchBean 实例之后的情况。NewsPersister 类的相关代码如下:

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

在完成了NewsPersister 类的定义之后,我们来使用xml 对其进行注册和依赖绑定,我们来看一下对应的xml 文件:

<bean id = "newsFetchBean" class = "xxxxxx.NewsFetchBean" singleton = "false"/>
<bean id = "newsPersister" calss = "xxxxxx.NewsPersister">
    <property name = "newsFetchBean">
        <ref bean = "newsFetchBean"/>
    </property>
</bean>

上面的步骤都完成之后,我们来多次调用NewsPersister 类实例的persistNews 方法,却发现每次返回的结果都一样。这说明了,每次返回的对象实例都是相同的。但是我们明明将NewsFetchBean 的作用域范围声明为了prototype 类型,为什么得到的却是这个结果。

其实NewsFetchBean 的声明没有问题,问题的本质是在于实例的取得方式上。

虽然NewsFetchBean 的scope 声明为了prototype,但是当容器将一个NewsFetchBean 注册到NewsPersister 之后,NewsPersister 就会一直拥有NewsFetchBean 的实例引用。

虽然我们在每次调用persistNews 之后都输出了NewsFetchBean 实例,但是这个实例却是第一次注入到NewsPersister 中的实例。

也就是说,在第一个NewsFetchBean 的实例注入到NewsPersister 之后,NewsPersister 再没有向容器中申请过新的实例。所以,容器就不会再为NewsPersister 注入新的实例了。

总结

这篇文章讲述了一些使用prototype 并获取实例过程中发现的问题,作为方法注入与方法替换功能概念引入的铺垫。后续文章介绍其他相关的内容。