我工作的项目对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
注释不再被编织。每次服务类调用persist
对象的PersonDao
方法,没有开始事务。
值得注意的是:
PersonDao
中定义的所有方法都正确地编织,但遗传的那些(例如persist(Object entity)
)不编织。编译时编织和加载时间编织应该做同样的事情,只是在不同的时刻。为什么织的行为改变了吗?
Tomcat的默认classlLoader
是WebappClassLoader
,但你需要`TomcatInstrumentableClassLoader的。
有两个解决方案:
- 修改WebappLoader.class
更改WebappLoader.java
private String loaderClass = "org.apache.catalina.loader.WebappClassLoader";
更换:
private String loaderClass = "org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader";
编译并替换类文件(catalina.jar),那么它的工作原理。
这里需要依赖罐子:catalina.jar
,tomcat-coyote.jar
,tomcat-util.jar(/bin)
,tomcat-juli.jar
- 修改的context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
你可能缺少的公共构造这些类的内部链接,@Transactional将工作仅当类具有公共构造函数和公共方法。