我的Singleton类的Spring和IoC(web-app,Tomcat)

vmg*_*vmg 2 java spring

我有这样的单例类:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

所以,我有一个班级与所有实体经理.interfases CategoriesManager和ShortcutsManager的所有实现我想用Spring IoC设置.我已将监听器添加到web.xml中

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它们时,我得到NullPointerException:ApplicationSupervisor.getInstance().getShortcutsManager(); =将返回null.

请帮助我,我是Spring IoC的新手.

谢谢!

ska*_*man 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>
Run Code Online (Sandbox Code Playgroud)

注意singleton="true"这里是多余的 - 默认情况下,所有Spring bean都是单例.

使用此配置,您可以通过Spring BeanFactory,bean注入或以编程方式访问单例ApplicationSupervisor.getInstance().

然而,这并不是一个管理你的singetons的好方法.getInstance()你应该注入ApplicationSupervisor使用它的bean,而不是使用静态.这是IoC的重点.