单例类中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 < 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; }
}
<bean id="Systemhelper" class="com.xinglong.web.util.SystemHelper">
<property name="ruleDao">
<ref bean="DAO1">
</property>
</bean>
//DAO1,已按正常配置
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