代码之家  ›  专栏  ›  技术社区  ›  vmg

Spring和IOC为我的单人课(Web应用程序,Tomcat)

  •  2
  • vmg  · 技术社区  · 14 年前

    我有这样的单件课程:

    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>
    

    所以,我和所有实体经理都上过一个班。在InterfacesCategoriesManager和ShortcutsManager上的所有实现,我想与SpringIOC一起设置。 我已将侦听器添加到web.xml中

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

    但当我尝试使用它们时,会得到nullpointerException: applicationSupervisor.getInstance().getShortcutsManager();=将返回空值。

    拜托,帮帮我,我是春季国际奥委会的新人。

    谢谢您!

    2 回复  |  直到 14 年前
        1
  •  6
  •   skaffman    14 年前

    它不起作用,因为你有两个单件,而不是一个。第一个单件由 ApplicationSupervisor.getInstance() 第二个由Spring管理。你还没有告诉斯普林 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" 这里是多余的-默认情况下,所有的SpringBean都是单例的。

    通过这种配置,您可以通过Spring的 BeanFactory ,bean injection,或以编程方式通过 applicationsupervisor.getInstance()。 .

    然而,这并不是管理你的歌手的好方法。而不是静态的 获取实例() 你应该注射 ApplicationSupervisor 到使用它的豆子里。这就是国际奥委会的全部观点。

        2
  •  1
  •   Matt    14 年前

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

    Spring没有绑定到Java的“新”关键字中

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