携手创作,共同成长!这是我参与「掘金日新计划 · 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 并获取实例过程中发现的问题,作为方法注入与方法替换功能概念引入的铺垫。后续文章介绍其他相关的内容。