我有一個BaseService接口,本意是提供一些通用的方法,具體業務Service繼承這個BaseService。在BaseService內有一個BaseDao,也是提供的通用方法。
但是現在出現一個問題,在業務Service中調用繼承的BaseService方法時發現,BaseDao==null,沒有注入進去,這是什麼原因?
具體舉個例子:
BaseService如下:
- public interface BaseService {
- /**
- * 根據HQL查詢數據庫
- * @param hql
- * @return
- */
- public List findByHql(String hql);
- }
public interface BaseService {
/**
* 根據HQL查詢數據庫
* @param hql
* @return
*/
public List findByHql(String hql);
}
BaseService實現類:
- 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;
- }
- }
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:
- public interface SysActionService extends BaseService{
- //未定義任何方法,調用BaseService中的方法
- }
public interface SysActionService extends BaseService{
//未定義任何方法,調用BaseService中的方法
}
實現類:
- 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;
- }
- }
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配置如下:
- <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>
<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,調用:
- sysActionService.findByHql("from SysAction");
sysActionService.findByHql("from SysAction");
斷點發現,執行到BaseServcie的時候,baseDao== null.
爲什麼這個baseDao沒注入進去呢?baseService中set/get方法都有啊
回答
<property name="sysActionDao" ref="sysActionDao" />
</bean>
要用parent屬性來指定。