日期:2014-05-17  浏览次数:20827 次

spring 泛型注入问题
public interface BaseDao<T, PK extends Serializable> {}  //baseDao接口

public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK>{}    //baseDao接口的实现

public class BaseServiceImpl<T,PK extends Serializable> implements BaseService<T,PK> {      //baseService接口的实现
 
 public BaseDao<T,PK> baseDao;
 
 
 public BaseDao<T, PK> getBaseDao() {
  return baseDao;
 }
 
 @Resource(name="baseDaoImpl")       //泛型注入出现问题<T,PK>不能注入到baseDaoImpl中 public void setBaseDao(BaseDao<T, PK> baseDao) {
  this.baseDao = baseDao;
 }

 }


请问有什么方法可以将<T, PK> 所指的类型注入到baseDaoImpl类中????

------解决方案--------------------
这个做法本身就是错误的
泛型只在编译期间存在,所以你觉得运行时,怎么去注入一个泛型
然后,注解功能不能被继承
也就是说,就算你这个写法可以被注入,你的实际业务类也是无法根据业务的泛型自动转型的

给你个建立,以约定大于配置的思路

public class BaseServiceImpl<T,PK extends Serializable> implements BaseService<T,PK> {
 public BaseDao getBaseDao() {
  try{
  Field f = getClass().getDeclaredField("baseDao");
  f.setAccessible(true);
  return (BaseDao) f.get(this);
  }catch(Exception e) {
    System.out.println("未找到约定DAO类");
    return null;
  }
 }
}


然后,你每个实现的DAO里,提供一个名叫baseDao的dao,不需要其他方法就可以了

public MySerivceImpl extends BaseServiceImpl<类型,类型> implements MyService<类型,类型> {
 @Autowired
 private MyDaoImpl baseDao;

}

------解决方案--------------------
引用:
引用:
如果你的本意是希望詩歌公用DAO,避免pg自己寫更多DAO,只讓pg寫service即可。
完全可以寫成類似這樣:


Java code