日期:2014-05-20  浏览次数:20621 次

有继承时Spring注入不进去,什么原因呢?
我有一个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>