【Spring】实现ApplicationListener接口,为什么会多生成一个实例?

EDDGA 2011-06-18 05:26:59
有两个类Test和ClassA如下

Test

package temp;

import ..........
.................

public class Test {

private ClassA a = null;

public Test() { super(); }

public void setA(ClassA arg) {
this.a = arg;
System.out.println("Test - My a's HashCode is " + this.a.hashCode());
}

public ClassA getA() {
return (this.a);
}

}



ClassA

package temp;

import ..........
.................

public class ClassA implements AppclicationListener {

public ClassA() {
super();
System.out.println("ClassA - HashCode: " + this.hashCode());
}

public void onApplicationEvent(ApplicationEvent arg0) { }

}



Spring配置文件片段

<beans>

<bean class="test.Test">
<property name="a" ref="a" />
</bean>

<bean id="a" class="test.ClassA" scope="prototype" />

</beans>



控制台输出:

ClassA - HashCode: 23473608
ClassA - HashCode: 16821027
Test - My a's HashCode is 16821027


Test只持有一个ClassA实例,但实际上Spring创建了两个ClassA实例。
当ClassA不实现ApplicationListener接口时,控制台输出看到只生成一个ClassA

ClassA - HashCode: 26250401
Test - My a's HashCode is 26250401


请问:为什么实现ApplicationListener之后会多生成一个ClassA实例?这个“没用的”ClassA实例哪里去了?谁会需要这个多余的实例啊?

请指点,谢谢!
...全文
570 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
EDDGA 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yvhiwssn 的回复:]

<bean id="a" class="test.ClassA" scope="prototype" />

你配置的作用域是原型。单例就只会有一个。
[/Quote]

我做的是2次测试,一次ClassA实现了AppclicationListener,另一次没有实现。而两次测试都是写的prototype。结果就是,一次产生了2个ClassA(不同的Hash),而另一次只产生了1个ClassA。
yvhiwssn 2011-10-27
  • 打赏
  • 举报
回复
<bean id="a" class="test.ClassA" scope="prototype" />

你配置的作用域是原型。单例就只会有一个。
EDDGA 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xinghen88 的回复:]

一个是ClassA走构造函数的时候创建的,一个是你在调用的时候创建的。
[/Quote]

不太明白,ClassA和Test的引用、调用以及spring配置从来没改变过。
改变的只是ClassA实现了AppclicationListener接口,然后就产生多一个ClassA的实例了,这个多产生的实例不知道是谁来持有的
sun_cathay 2011-06-24
  • 打赏
  • 举报
回复
支持!!
xinghen88 2011-06-24
  • 打赏
  • 举报
回复
一个是ClassA走构造函数的时候创建的,一个是你在调用的时候创建的。
安心逍遥 2011-06-24
  • 打赏
  • 举报
回复
一个是项目一开始就创建的,一个是调用时的
EDDGA 2011-06-24
  • 打赏
  • 举报
回复
呃,懂的指点下谢谢
EDDGA 2011-06-21
  • 打赏
  • 举报
回复
哪位指点下,谢谢

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧