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类中???
为什么要这么设计呢?
你使用BaseDao<T, PK extends Serializable>的目的不就是想尽量减少pg自己写自己的dao吗?
为什么多此一举还要这样注入?
在serviceImpl中,直接
private BaseDao<Forum, Long> forumDao;
private BaseDao<Topic, Long> topicDao;
private BaseDao<Post, Long> postDao;
这样的方式,即可。
这个做法本身就是错误的
泛型只在编译期间存在,所以你觉得运行时,怎么去注入一个泛型
然后,注解功能不能被继承
也就是说,就算你这个写法可以被注入,你的实际业务类也是无法根据业务的泛型自动转型的
给你个建立,以约定大于配置的思路
Java code
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,不需要其他方法就可以了
Java code
public MySerivceImpl extends BaseServiceImpl<类型,类型> implements MyService<类型,类型> {
@Autowired
private MyDaoImpl baseDao;