我有一个基于Spring的WebApp。在我的应用程序方面,我有这个bean定义:什么会导致Spring IoC为每个WebApp实例化单个bean的多个实例?
<bean id="someSingleton" class="com.fake.SomeSingleton" scope="singleton"/>
我已经具有@Controller
注释的一个春天调度servlet定义和一类,而我自动有线这个bean,期待春天到永远只实例化这个上课一次。但是,根据以下调试代码,Spring不止一次地实例化该类:
private static final Semaphore SANITY_CHECK = new Semaphore(1);
public FakeSingleton(){
if(!SANITY_CHECK.tryAcquire()){
log.error("why?");
System.exit(-1);
else{
log.error("OK");
}
}
可能是什么原因?
注:我用的弹簧3.1.2.RELEASE
编辑: 感谢他们给我的提示,我找到了罪魁祸首。
除了DispatcherServlet之外,我的web.xml中还有一个ContextLoaderListener。删除它后,SomeSingleton只实例化一次。
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>FakeService</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
你能解释一下你的第一点吗?为什么代理不能像其他任何继承类一样工作,并只调用一次super()(被代理的bean的构造函数)? –