【发布时间】:2015-09-18 19:08:06
【问题描述】:
我正在处理的项目与DAOs 的结构类似:
/**
* Base DAO class
*/
@Transactional
public class JPABase {
@PersistenceContext
private EntityManager entityManager;
public void persist(Object entity) {
entityManager.persist(entity);
}
//some more methods in here
}
和
/**
* Generic DAO class implementation
*/
@Transactional
public abstract class GenericDao extends JpaBase {
//some methods in here
}
和
/**
* Specialized DAO class
*/
@Repository
@Transactional
public class PersonDao extends GenericDao {
//some methods in here
}
到目前为止,该项目使用编译时编织,但配置已更改为使用<context:load-time-weaver/>和-javaagent:/opt/tomcat7-1/lib/spring-instrument.jar。
由于已应用此更改,JpaBase 和 GenericDao 的 @Transactional 注释不再编织。每次服务类在PersonDao 对象上调用persist 方法时,都不会启动任何事务。
值得注意的:
- 这在过去使用编译时编织时可以工作。
-
PersonDao中定义的所有方法都已正确编织,但继承的方法(例如persist(Object entity))未编织。
编译时编织和加载时编织应该做同样的事情,只是在不同的时刻。为什么编织行为发生了变化?
【问题讨论】:
-
IIRC 你需要为 LTW 指定包,也许你缺少一个?
-
整个项目包含在
<include>元素的within属性中,在aop.xml文件中。 -
你试过blog.timmattison.com/archives/2012/04/19/…的技巧和窍门吗?
-
首先,@Transactional 只应该在 JPABase 子类中。其次,尝试将 spring-instrument-tomcat.jar 放在 Apache Tomcat 目录的 /lib 路径中,并在 /conf 上配置你的 context.xml,使用类加载器到 weaver (org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader)
-
@ksokol 我的理解是,他们回到编译时间编织而不是加载时间(所以没有解决方案)......
标签: java spring aspectj load-time-weaving compile-time-weaving