Spring @Transactional is applied both as a dynamic Jdk proxy and an aspectj aspect
Strange, it sounds like you have this configuration:
<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" />
(Transaction support using AspectJ, not JDK proxies)
Since your config doesn't have a mode attribute, the default should kick in (proxy mode). But AnnotationTransactionAspect is the exact aspect used by the aspectj mode.
To get aspectj transactions working with java config.
@EnableWebMvc@Configuration@ComponentScan("com.yourdomain")@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)public class ApplicationConfig extends WebMvcConfigurerAdapter { @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { //... } @Bean public JpaTransactionManager transactionManager() { JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory().getObject()); return bean ; } @Bean public AnnotationTransactionAspect annotationTransactionAspect() { AnnotationTransactionAspect bean = AnnotationTransactionAspect.aspectOf(); bean.setTransactionManager(transactionManager()); return bean; }}
If you are using maven:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.7</version> <configuration> <aspectLibraries> <aspectLibrary> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </aspectLibrary> </aspectLibraries> <complianceLevel>1.8</complianceLevel> <source>1.8</source> <target>1.8</target> <showWeaveInfo>true</showWeaveInfo> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions></plugin>
If you are using eclipse, this will ensure that the weaving is done when deploying inside eclipse: