首先偶是初学者,想问问,spring可以不可以对接口注入?可以不可以对抽象类的成员注入?如果可以的话偶遇到了一个注入为null的问题,请帮忙看看,不胜感激!
接口代码package entity.model.dao.base;import java.io.Serializable;
import java.util.List;public interface EntityDao <T> {
@SuppressWarnings("unchecked")
public List getAll() throws Exception;
public T get(Serializable id) throws Exception;
public void save(Object o) throws Exception;
public void removeById(Serializable id) throws Exception;
public void remove(Object o);
}//end interface EntityDao 抽象类代码,这个类主要用来被继承的package entity.model.dao.base;public abstract class EntityDaoBase <T> {
protected HibernateDao hibernateDao;
protected IbatisDao ibatisDao;
public String message; public HibernateDao getHibernateDao() {return this.hibernateDao;}//end method getHibernateDao
public void setHibernateDao(HibernateDao hibernateDao) {this.hibernateDao = hibernateDao;}//end method setHibernateDao public IbatisDao getIbatisDao() {return this.ibatisDao;}//end method getIbatisDao
public void setIbatisDao(IbatisDao ibatisDao) {this.ibatisDao = ibatisDao;}//end method setIbatisDao public String getMessage() {return this.message;}//end method getMessage
public void setMessage(String message) {this.message = message;}//end method setMessage }//end class EntityDaoBase 基本实现类代码package entity.model.dao.base;import java.io.Serializable;
import java.util.List;import org.springframework.orm.ObjectRetrievalFailureException;@SuppressWarnings("unchecked")
public class EntityDaoBaseImpl<T> extends EntityDaoBase<T> implements EntityDao<T> { public void setHibernateDao(HibernateDao hibernateDao) {
this.hibernateDao = hibernateDao;
System.out.println("派生类注入HibernateDao");
}//end method setHibernateDao public void setIbatisDao(IbatisDao ibatisDao) {
this.ibatisDao = ibatisDao;
System.out.println("派生类注入IbatisDao");
}//end method setIbatisDao /**
* 根据ID移除对象.
* @see HibernateGenericDao # removeById(Class, Serializable)
*/
public void removeById(Serializable id) {this.removeById(getEntityClass(), id);}//end method removeById /** 删除对象 */
public void remove(Object o) {this.hibernateDao.getHibernateTemplate().delete(o);}//end method remove /** 根据ID删除对象 */
public void removeById(Class<T> entityClass, Serializable id) {this.remove(this.get(entityClass, id));}//end method removeById public void flush() {this.hibernateDao.getHibernateTemplate().flush();}//end method flush public void clear() {this.hibernateDao.getHibernateTemplate().clear();}//end method clear public T get(Serializable id) throws Exception {return get(entityClass, id);}//end method get /** 根据ID获取对象 */
@SuppressWarnings("hiding")
public T get(Class<T> entityClass, Serializable id) {
T o = (T)this.ibatisDao.getSqlMapClientTemplate().queryForObject(entityClass.getName() + POSTFIX_EDIT, id);
if (o == null) {throw new ObjectRetrievalFailureException(entityClass, id);}//end if
return o;
}//end method get public List<T> getAll() {return this.getAll(entityClass);}//end method getAll
/** 获取全部对象 */
@SuppressWarnings("hiding")
public <T> List<T> getAll(Class<T> entityClass) {
return this.ibatisDao.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null);
}//end method getAll public void save(Object o) throws Exception {
if (o == null) {throw new Exception("model can't be null when save!");}//end if
try {this.hibernateDao.getHibernateTemplate().saveOrUpdate(o);}//end try
catch (Exception e) {e.printStackTrace();}//end catch Exception
}//end method save }//end class
调用代码package entity.model.consumer.business;import entity.model.consumer.Consumer;
import entity.model.dao.base.EntityDao;
public class ConsumerProcessor {
private EntityDao<Consumer> consumerDao; public ConsumerProcessor() {}//end Construct method public void setConsumerDao(EntityDao<Consumer> consumerDao) {
this.consumerDao = consumerDao;
}//end method setConsumerDao public void registerNewOne(Consumer consumer) {
try {this.consumerDao.save(consumer);}//end try
catch (Exception e) {e.printStackTrace();}//end catch Exception
}//end method registerNewOne }//end class LandProcessor spring配置<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName" default-lazy-init="true">
<bean id="ibatisDao" class="entity.model.dao.base.IbatisDao"/>
<bean id="hibernateDao" class="entity.model.dao.base.HibernateDao"/>
<bean id="daoBase" class="entity.model.dao.base" abstract="true">
<property name="ibatisDao">
<ref local="ibatisDao"/>
</property>
<property name="hibernateDao">
<ref local="hibernateDao"/>
</property>
</bean>
<bean id="consumerDao" class="entity.model.dao.base.EntityDaoBaseImpl" parent="daoBase"/>
</beans>我的想法是这样的,最好能在抽象类中注入两个实例ibatisDao hibernateDao然后基础实现()中直接调用,如果不用基础实现类将来可以继承抽象类使用ibatisDao hibernateDao两个实例来重新应用实现.
如果抽象类不能注入,则考虑在派生类中注入.
现在的问题是,运行后ibatisDao hibernateDao两个实例始终为null报空指针异常.
偶是初学者,实在是不知道哪里出了问题,上网搜了半天也没搞定,只好麻烦大家乐,哪位知道请指点一二,在下不胜感激,谢谢~!谢谢~!
接口代码package entity.model.dao.base;import java.io.Serializable;
import java.util.List;public interface EntityDao <T> {
@SuppressWarnings("unchecked")
public List getAll() throws Exception;
public T get(Serializable id) throws Exception;
public void save(Object o) throws Exception;
public void removeById(Serializable id) throws Exception;
public void remove(Object o);
}//end interface EntityDao 抽象类代码,这个类主要用来被继承的package entity.model.dao.base;public abstract class EntityDaoBase <T> {
protected HibernateDao hibernateDao;
protected IbatisDao ibatisDao;
public String message; public HibernateDao getHibernateDao() {return this.hibernateDao;}//end method getHibernateDao
public void setHibernateDao(HibernateDao hibernateDao) {this.hibernateDao = hibernateDao;}//end method setHibernateDao public IbatisDao getIbatisDao() {return this.ibatisDao;}//end method getIbatisDao
public void setIbatisDao(IbatisDao ibatisDao) {this.ibatisDao = ibatisDao;}//end method setIbatisDao public String getMessage() {return this.message;}//end method getMessage
public void setMessage(String message) {this.message = message;}//end method setMessage }//end class EntityDaoBase 基本实现类代码package entity.model.dao.base;import java.io.Serializable;
import java.util.List;import org.springframework.orm.ObjectRetrievalFailureException;@SuppressWarnings("unchecked")
public class EntityDaoBaseImpl<T> extends EntityDaoBase<T> implements EntityDao<T> { public void setHibernateDao(HibernateDao hibernateDao) {
this.hibernateDao = hibernateDao;
System.out.println("派生类注入HibernateDao");
}//end method setHibernateDao public void setIbatisDao(IbatisDao ibatisDao) {
this.ibatisDao = ibatisDao;
System.out.println("派生类注入IbatisDao");
}//end method setIbatisDao /**
* 根据ID移除对象.
* @see HibernateGenericDao # removeById(Class, Serializable)
*/
public void removeById(Serializable id) {this.removeById(getEntityClass(), id);}//end method removeById /** 删除对象 */
public void remove(Object o) {this.hibernateDao.getHibernateTemplate().delete(o);}//end method remove /** 根据ID删除对象 */
public void removeById(Class<T> entityClass, Serializable id) {this.remove(this.get(entityClass, id));}//end method removeById public void flush() {this.hibernateDao.getHibernateTemplate().flush();}//end method flush public void clear() {this.hibernateDao.getHibernateTemplate().clear();}//end method clear public T get(Serializable id) throws Exception {return get(entityClass, id);}//end method get /** 根据ID获取对象 */
@SuppressWarnings("hiding")
public T get(Class<T> entityClass, Serializable id) {
T o = (T)this.ibatisDao.getSqlMapClientTemplate().queryForObject(entityClass.getName() + POSTFIX_EDIT, id);
if (o == null) {throw new ObjectRetrievalFailureException(entityClass, id);}//end if
return o;
}//end method get public List<T> getAll() {return this.getAll(entityClass);}//end method getAll
/** 获取全部对象 */
@SuppressWarnings("hiding")
public <T> List<T> getAll(Class<T> entityClass) {
return this.ibatisDao.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null);
}//end method getAll public void save(Object o) throws Exception {
if (o == null) {throw new Exception("model can't be null when save!");}//end if
try {this.hibernateDao.getHibernateTemplate().saveOrUpdate(o);}//end try
catch (Exception e) {e.printStackTrace();}//end catch Exception
}//end method save }//end class
调用代码package entity.model.consumer.business;import entity.model.consumer.Consumer;
import entity.model.dao.base.EntityDao;
public class ConsumerProcessor {
private EntityDao<Consumer> consumerDao; public ConsumerProcessor() {}//end Construct method public void setConsumerDao(EntityDao<Consumer> consumerDao) {
this.consumerDao = consumerDao;
}//end method setConsumerDao public void registerNewOne(Consumer consumer) {
try {this.consumerDao.save(consumer);}//end try
catch (Exception e) {e.printStackTrace();}//end catch Exception
}//end method registerNewOne }//end class LandProcessor spring配置<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName" default-lazy-init="true">
<bean id="ibatisDao" class="entity.model.dao.base.IbatisDao"/>
<bean id="hibernateDao" class="entity.model.dao.base.HibernateDao"/>
<bean id="daoBase" class="entity.model.dao.base" abstract="true">
<property name="ibatisDao">
<ref local="ibatisDao"/>
</property>
<property name="hibernateDao">
<ref local="hibernateDao"/>
</property>
</bean>
<bean id="consumerDao" class="entity.model.dao.base.EntityDaoBaseImpl" parent="daoBase"/>
</beans>我的想法是这样的,最好能在抽象类中注入两个实例ibatisDao hibernateDao然后基础实现()中直接调用,如果不用基础实现类将来可以继承抽象类使用ibatisDao hibernateDao两个实例来重新应用实现.
如果抽象类不能注入,则考虑在派生类中注入.
现在的问题是,运行后ibatisDao hibernateDao两个实例始终为null报空指针异常.
偶是初学者,实在是不知道哪里出了问题,上网搜了半天也没搞定,只好麻烦大家乐,哪位知道请指点一二,在下不胜感激,谢谢~!谢谢~!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货