2010-11-04 82 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"); 
}