首先,将以Controller结尾的名称给DAO确实很令人困惑,Controller和DAO共同具有不同的目的。
当您添加
@Transactional到服务或dao类时,为了使Spring在事务中起作用,需要创建该类的代理,它是一种包装,在执行代理类(考虑类的方法)之前spring启动事务,在执行之后,如果没有异常完成事务,则可以在spring中通过AOP和Annotations完成。用代码描述。
public class OriginalDaoImpl implements OriginalDao extends DaoSupport { public void save(Object o){ manager.save(o); }}public class ProxyDaoImpl implements OriginalDao { private OriginalDao originalDaoImpl; //instance of OriginalDaoImpl public void save(Object o){ try{ transaction.start(); originalDaoImpl.save(o); transaction.commit(); }catch(Exception e){ transaction.rollback(); }finally{ //clean up pre } }}如您所见,这不是确切的实现,而是基础代码,说明事务如何神奇地为您工作。关键在于接口OriginalDao,由于OriginalDaoImpl和ProxyDaoImpl都实现了相同的接口,因此可以轻松进行注入。因此,它们可以交换,即代理代替原始文件。可以通过Java动态代理在Java中创建此动态代理。现在,问题是如果您的类未实现接口,那么替换将变得更加困难。据我所知,CGLIB库之一在这种情况下会有所帮助,在这种情况下,它会为所考虑的类生成一个动态子类,并且在覆盖方法中,它通过调用
super.save(o)
委托给原始代码来执行上述操作。
现在开始注射问题。
- 创建接口并让您的dao实现该功能,并且spring将默认使用JDK代理,因为它现在正在运行。
- 将
proxy-target-
属性添加到<tx:annotation-driven transaction-manager="transactionManager"/>
就异常而言,它正在抛出,因为它期望注入的bean是’HibernateController’类型的,但不是。
供您参考,您可以参考下面的链接。
- 10.5.6使用@Transactional
- springAOP文件
希望这可以帮助 !!!!!。



