2010-11-04 106 views
2

我有這樣的單例類:春季和IOC對我的Singleton類(web應用程序,Tomcat)的

package ua.org.bytes.ewt; 

import org.apache.struts2.ServletActionContext; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 
import ua.org.bytes.ewt.dao.CategoriesManager; 
import ua.org.bytes.ewt.dao.ShortcutsManager; 

/** 
* 
* @author Vitaliy Ganzha 
*/ 
public class ApplicationSupervisor { 
    private static final ApplicationSupervisor INSTANCE = new ApplicationSupervisor(); 
    private CategoriesManager categoriesManager; 

    public void setCategoriesManager(CategoriesManager categoriesManager) { 
     this.categoriesManager = categoriesManager; 
    } 

    public void setShortcutsManager(ShortcutsManager shortcutsManager) { 
     this.shortcutsManager = shortcutsManager; 
    } 
    private ShortcutsManager shortcutsManager; 

    public ShortcutsManager getShortcutsManager() { 
     return shortcutsManager; 
    } 

    private ApplicationSupervisor(){ 
     /*WebApplicationContext context = 
     WebApplicationContextUtils.getRequiredWebApplicationContext(
        ServletActionContext.getServletContext() 
     ); 

     categoriesManager = (CategoriesManager)context.getBean("categoriesManager"); 
     shortcutsManager = (ShortcutsManager)context.getBean("categoriesManager");*/ 
    } 

    public static ApplicationSupervisor getInstance(){ 
     return INSTANCE; 
    } 

    /** 
    * @return the categoriesManager 
    */ 
    public CategoriesManager getCategoriesManager() { 
     return categoriesManager; 
    } 

} 

而且applicationContext.xml中:

<beans default-autowire="autodetect"> 
    <bean id="categoriesManager" class="ua.org.bytes.ewt.dao.CategoriesManagerImpl"></bean> 
    <bean id="shortcutsManager" class="ua.org.bytes.ewt.dao.ShortcutsManagerImpl"></bean> 
    <bean id="applicationSupervisor" class="ua.org.bytes.ewt.ApplicationSupervisor" singleton="true"> 
     <property name="categoriesManager"> 
      <ref local="categoriesManager"/> 
     </property> 
     <property name="shortcutsManager"> 
      <ref local="shortcutsManager"/> 
     </property> 
    </bean> 
</beans> 

所以,我有一個類所有實體經理。我想用Spring IoC設置Interceptor CategoriesManager和ShortcutsManager上的所有實現。 我已經添加到聽者的web.xml

<listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

但是當我嘗試與他們合作,我得到NullPointerException異常: ApplicationSupervisor.getInstance()getShortcutsManager(); =會返回null。

請幫助我,我是Spring IoC的新成員。

謝謝!

回答

6

它不工作,因爲你有兩個單身,沒有之一。第一個單身人士由ApplicationSupervisor.getInstance()管理,第二個由Spring管理。你還沒有告訴Spring有關getInstance()工廠方法。

您必須聲明你的Spring bean使用getInstance()

<bean id="applicationSupervisor" class="ua.org.bytes.ewt.ApplicationSupervisor" 
     factory-method="getInstance"> 
    <property name="categoriesManager"> 
     <ref local="categoriesManager"/> 
    </property> 
    <property name="shortcutsManager"> 
     <ref local="shortcutsManager"/> 
    </property> 
</bean> 

注意singleton="true"是多餘的位置 - 所有的Spring bean是默認單身。

使用此配置,您可以通過Spring的BeanFactory,bean注入或通過ApplicationSupervisor.getInstance()以編程方式訪問單例。

但是,這不是一個很好的管理你的singetons的方法。您應該將ApplicationSupervisor注入到使用它的bean中,而不是使用靜態的getInstance()。這是IoC的重點。

+0

我想將ApplicationSupervisor注入到bean中,但我拒絕了這個想法,因爲我有很多bean,也許我會有一個插件系統,它會使用這些對象。 – vmg 2010-11-04 12:13:14

+1

*不是說singleton =「true」在這裏是多餘的*我想你的意思是*請注意...... * – 2010-11-04 13:13:46

1

你有沒有試過類似的東西來加載你的應用程序管理器?

Spring不掛鉤到Java的「新」的關鍵字

static { 
    INSTANCE = (ApplicationSupervisor) 
     new ClassPathXmlApplicationContext("/ApplicationContext.xml").getBean("applicationSupervisor"); 
}