关于单例模式的类在SSH中的配置,加载不到DAO

单例类中dao加载不到,为null。



我的配置如下:

public class SystemHelper {

private static SystemHelper instance = null;

private DAO1 ruleDao ;

     private static Hashtable buySaleRuleHt = null

public void setRuleDao(DAO1 ruleDao) {
    this.ruleDao = ruleDao;
}

     public static synchronized SystemHelper getInstance() {

    if (instance == null)
        instance = new SystemHelper();
    return instance;
}

     public synchronized Hashtable getBuySaleRulHt() {
    if (buySaleRuleHt == null || buySaleRuleHt.isEmpty()) {
        <span style="color: red;">List list = ruleDao.findAll();//这里的DAO为null</span>
        WebBuySaleRule bo = null;
        for (int i = 0; i &lt; list.size(); i++) {
            bo = (WebBuySaleRule) list.get(i);
            buySaleRuleHt.put(bo.getRuleId(), bo);
        }
    }
    return buySaleRuleHt;
}

public synchronized Hashtable reloadBuySaleRuleHt() {
    buySaleRuleHt.clear();
    this.getBuySaleRulHt();

    return buySaleRuleHt;
}

}





applicationContext.xml

    <bean id="Systemhelper" class="com.xinglong.web.util.SystemHelper">
<property name="ruleDao">
<ref bean="DAO1">
</property>
</bean>
//DAO1,已按正常配置




action中调用:



Hashtable kindsHt = SystemHelper.getInstance().getGoldKindHt();






哪位知道该怎样配置

首先我要说 你的配置没问题!
问题就在于 你的是单例模式“是自己来触发”所以spring拦截不到 所以不会注入dao实例。

解决的办法是,在你的普通层 非单例的类里面。如果有配置了dao注入,哪么就这么写:
[code="java"]
...
public setDao(obj){
this.dao = obj;
SystemHelper.setRuleDao(dao);//这样获得实例
}
...
[/code]

不过我不明白 LZ为什么要这样用单例。 你这样根本就没有用到单例。单例管理的是
instance 这个对象。跟那个DAO无关。
你这就好比 到处想办法想把冲锋枪改成单发的打得精准点,那你为什么不直接用步枪?

没见过这么用的,你在哪里使用到xml的配置呢?
都没有启动Spring的ApplicationContext。而且SystemHelper.getInstance()得到的与Context管理的根本就是两个对象,也不能获取DAO

你使用了spring的依赖注入,就需要通过spring去获取bean对象
Hashtable kindsHt = SystemHelper.getInstance().getGoldKindHt();

你这样写就是自己去生产一个对象,spring当然无法伊奈注入啦。
解决办法就是在action里也依赖注入service