我有一个BaseService接口,本意是提供一些通用的方法,具体业务Service继承这个BaseService。在BaseService内有一个BaseDao,也是提供的通用方法。
但是现在出现一个问题,在业务Service中调用继承的BaseService方法时发现,BaseDao==null,没有注入进去,这是什么原因?
具体举个例子:
BaseService如下:
- Java code
public interface BaseService { /** * 根据HQL查询数据库 * @param hql * @return */ public List findByHql(String hql);}
BaseService实现类:
- Java code
public class BaseServiceImpy implements BaseService { private BaseDao baseDao; public List findBySql(String sql) { return this.baseDao.findBySql(sql); //这里baseDao == null }//setter, getter public BaseDao getBaseDao() { return baseDao; } public void setBaseDao(BaseDao baseDao) { this.baseDao = baseDao; }}
我有一个业务Service:
- Java code
public interface SysActionService extends BaseService{ //未定义任何方法,调用BaseService中的方法}
实现类:
- Java code
public class SysActionServiceImpy extends BaseServiceImpy implements SysActionService{ private static Log log = LogFactory.getLog(SysActionService.class); private SysActionDao sysActionDao; public SysActionDao getSysActionDao() { return sysActionDao; } public void setSysActionDao(SysActionDao sysActionDao) { this.sysActionDao = sysActionDao; }}
spring配置如下:
- XML code
<bean id="baseDao" class="com.dao.impy.BaseDaoImpy"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="baseService" class="com.impy.BaseServiceImpy"> <property name="baseDao" ref="baseDao"></property> </bean> <bean id="sysActionDao" class="com.dao.impy.SysActionDaoImpy"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="sysActionService" class="com.service.impy.SysActionServiceImpy"> <property name="sysActionDao" ref="sysActionDao" /> </bean>
我在Struts2的Action中注入了sysActionService,调用:
- Java code
sysActionService.findByHql("from SysAction");
断点发现,执行到BaseServcie的时候,baseDao== null.
为什么这个baseDao没注入进去呢?baseService中set/get方法都有啊
------解决方案--------------------------------------------------------
作为com.dao.impy.SysActionDaoImpy类中的findBySql方法并没有被实例化,
虽然有<bean id="baseService" class="com.impy.BaseServiceImpy">但是这个和SysActionDaoImpy无任何关系
可以这样:
- XML code
<bean id="sysActionDao" class="com.dao.impy.SysActionDaoImpy"> <property name="sessionFactory" ref="sessionFactory" /> <property name="baseDao" ref="baseDao"></property> </bean>