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

Spring注解注入的问题,看能解决吗?
三层构架ACTION->SERVICE->DAO
//这个类不注册为service,继承用
public class BaseService{
  public void save(T entity) {
baseHibernateDAO.saveOrUpdate(entity);
}
}

//这个类不注册@Repository,继承用
public class BaseHibernateDAO extends HibernateDaoSupport {
public <T> void saveOrUpdate(Object entity) {
getHibernateTemplate().saveOrUpdate(entity);
  }
}
//继承的SETVICE,注册为@Service
public class UserService extends BaseService{
  @Autowired
public UserDAO userDAO;
  //空的,直接继承父类的save方法
}
//继承的DAO,注册@Repository
public class UserDAO extends BaseHibernateDAO {
//空的,直接继承父类的saveOrUpdate方法
}
因为Autowired是byType的,这样我ACTION调用UserService 的save,save在调用DAO中的saveOrUpdate方法,实际上最终调用到的是UserDAO继承的saveOrUpdate,这样我就可以实现userAction-》userService-》userDAO的调用,userDAO必要时也可以重写父类方法。但这样我在再写一个如deptDAO继承BaseHibernateDAO 的时候在用Autowired就是报错,因为byType认为userDAO和deptDAO是一个类型。
如果我用byName如@Autowired@Qualifier("baseHibernateDAO")方式,因为baseService需要调用BaseHibernateDAO中的方法,我需要注册BaseHibernateDAO,然后设置baseService以byName方式调用BaseHibernateDAO,但这样userAction-》userService-》userDAO(子类DAO也使用ByName方式)调用时实际上是调用BaseHibernateDAO中的saveOrUpdate,即使userDAO重写saveOrUpdate,也不会再调用userDAO中的方法。

问:有办法实现service层继承自baseService的方法,最终调用DAO层继承自BaseHibernateDAO的方法吗?




------解决方案--------------------
你的Autowired是byName的
------解决方案--------------------
用@Resource,好点
------解决方案--------------------
http://blog.csdn.net/penngo/article/details/6038991
有个DEMO,LZ可以看看
------解决方案--------------------
探讨
用@Resource,好点

------解决方案--------------------
LZ有那么纠结吗?
这个都是byName的方式
@Repository
public class UserDAO extends BaseHibernateDAO ;
 @Service
 public class UserService extends BaseService{
@Autowired
@Qualifier("userDao")
private UserDAO userDao;
}
 
action就不说了跟Service的注解一样:
注:
1.使用byName的方式,请在spring.xml中去定义
2. 调用Dao的方法时,这个方法是来自父类的,你最好多写一下,最好不要直接去调用父类的方法。但是调用也是没有问题的。就怕以后你的代码太乱。

 
 
------解决方案--------------------
byType的方式就不是吗?其实spring的在实例化DAO service的类全部是prototype 即使是单例也不会有你想的那种问题。如果你感觉不行的话,可以去看看spring对这几种方式的设计
------解决方案--------------------
不会,我的系统就是这样的

------解决方案--------------------
byType byName跟你说的scope没有直接关系,所以你说的他们直接没有关系的知道不?
如果有直接关系,哪spring就没有必要再出什么scope的配置咯
------解决方案--------------------
Spring容器里的bean默认的都是单例的跟所谓的byname、bytype、constructor没一毛关系

一般我自己都用byName