Java 我的单身班的Spring和IoC(web应用程序,Tomcat)

Java 我的单身班的Spring和IoC(web应用程序,Tomcat),java,spring,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.

我有这样的单身班:

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>

所以,我有一门课,所有的实体经理。我想用SpringIOC设置InterFasesCategoriesManager和ShortcutsManager上的所有实现。 我已将侦听器添加到web.xml中

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

org.springframework.web.context.ContextLoaderListener
但当我尝试与他们合作时,我得到了NullPointerException: ApplicationSupervisor.getInstance().getShortcutsManager();=将返回null

请帮帮我,我是新来的


谢谢大家!

您是否尝试过类似的方法来加载您的应用程序主管

Spring没有钩住java“new”关键字

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

它不起作用,因为你有两个单身汉,而不是一个。第一个单例由
ApplicationSupervisor.getInstance()
管理,第二个单例由Spring管理。您还没有告诉Spring关于工厂方法的
getInstance()

您需要声明Springbean以使用
getInstance()


请注意,
singleton=“true”
在这里是多余的-默认情况下,所有SpringBean都是单例的

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


然而,这并不是管理你的歌手的好方法。与其使用静态的
getInstance()
,不如将
ApplicationSupervisor
注入到使用它的bean中。这就是IoC的全部要点。

我考虑将ApplicationSupervisor注入bean,但我拒绝了这个想法,因为我有很多bean,也许,我会有一个插件系统,它将使用这些对象。不是singleton=“true”在这里是多余的,我想你的意思是。。。
<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>