gpt4 book ai didi

java - 我的 Singleton 类的 Spring 和 IoC(网络应用程序,Tomcat)

转载 作者:行者123 更新时间:2023-12-03 19:41:07 27 4
gpt4 key购买 nike

我有这样的单例类:

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 设置接口(interface) CategoriesManager 和 ShortcutsManager 上的所有实现。我已经在 web.xml 中添加了监听器

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

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

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

谢谢!

最佳答案

它不起作用,因为您有两个单例,而不是一个。第一个单例由 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 注入(inject)或通过 ApplicationSupervisor.getInstance() 以编程方式访问单例。

但是,这并不是管理单子(monad)的好方法。与其使用静态的 getInstance(),不如将 ApplicationSupervisor 注入(inject)到使用它的 bean 中。这就是 IoC 的重点。

关于java - 我的 Singleton 类的 Spring 和 IoC(网络应用程序,Tomcat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4096003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com