+++ /dev/null
-package de.spring.example;
-
-import org.aspectj.lang.annotation.After;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Before;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Aspect
-public class MyAdvice {
- private static final Logger LOGGER = LoggerFactory.getLogger(MyAdvice.class);
-
- // With execution we avoid double weaving (when call and when execution)
- @Before("@annotation(de.spring.example.annotation.initTransactional) && execution(* *(..))")
- public void initTransactional()
- {
- LOGGER.info("I am the Advice initTransaction.");
- TransactionManager.getInstance().initTransaction();
- }
-
-
- // With execution we avoid double weaving (when call and when execution)
- @After("@annotation(de.spring.example.annotation.commitTransactional) && execution(* *(..))")
- public void commitTransactional() {
- LOGGER.info("I am the Advice commitTransaction.");
- TransactionManager.getInstance().commitTransaction();
- }
-}
--- /dev/null
+package de.spring.example.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.stereotype.Component;
+
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Component
+public @interface beforeInitTransactional {
+
+}
--- /dev/null
+package de.spring.example.aspects;
+
+
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Aspect
+//Higher values has lower priority
+//@Order(1) Just works when using Spring AOP proxies
+//When weaving order is given by @DeclarePrecedence annotation, see: MyAspectsOrder
+public class BeforeMyAspect {
+ private static final Logger LOGGER = LoggerFactory.getLogger(BeforeMyAspect.class);
+
+ // With execution we avoid double weaving (when call and when execution)
+ @Before("@annotation(de.spring.example.annotation.beforeInitTransactional) && execution(* *(..))")
+ public void beforeInitTransactional() {
+ LOGGER.info("I am the Advice beforeInitTransaction.");
+ }
+}
--- /dev/null
+package de.spring.example.aspects;
+
+
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import de.spring.example.TransactionManager;
+
+@Aspect
+// Higher values has lower priority
+// @Order(2) Just works when using Spring AOP proxies
+//When weaving order is given by @DeclarePrecedence annotation, see: MyAspectsOrder
+public class MyAspect {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MyAspect.class);
+
+ // With execution we avoid double weaving (when call and when execution)
+ @Before("@annotation(de.spring.example.annotation.initTransactional) && execution(* *(..))")
+ public void initTransactional() {
+ LOGGER.info("I am the Advice initTransaction.");
+ TransactionManager.getInstance().initTransaction();
+ }
+
+
+ // With execution we avoid double weaving (when call and when execution)
+ @After("@annotation(de.spring.example.annotation.commitTransactional) && execution(* *(..))")
+ public void commitTransactional() {
+ LOGGER.info("I am the Advice commitTransaction.");
+ TransactionManager.getInstance().commitTransaction();
+ }
+}
--- /dev/null
+package de.spring.example.aspects;
+
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.DeclarePrecedence;
+
+@Aspect
+// When weaving order is given by @DeclarePreceden annotation
+@DeclarePrecedence("BeforeMyAspect, MyAspect")
+public class MyAspectsOrder {
+
+}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import de.spring.example.annotation.beforeInitTransactional;
import de.spring.example.annotation.commitTransactional;
import de.spring.example.annotation.initTransactional;
// IT WORKS WHEN WEAVING!!!
@initTransactional
+ @beforeInitTransactional
private void annotatedPrivateMethod() {
LOGGER.info("The Advice should be run before even with private methods because I AM WEAVING."
+ " IT WORKS EVEN CALLING FROM METHOD OF THE SAME CLASS. It doesn't when using proxies AOP.");
</weaver>
<aspects>
- <aspect name="de.spring.example.MyAdvice"/>
+ <aspect name="de.spring.example.aspects.MyAspect"/>
+ <aspect name="de.spring.example.aspects.BeforeMyAspect"/>
+ <aspect name="de.spring.example.aspects.MyAspectsOrder"/>
</aspects>
</aspectj>
aspectj-weaving="autodetect"/>
- <bean id="myAdvice" class="de.spring.example.MyAdvice">
-
- </bean>
+ <!--
+ There is no need of declaring aspects in Spring xml files because I am using the aop.xml file
+ <bean id="myAdvice" class="de.spring.example.aspects.MyAspect" />
+ <bean id="beforeMyAdvice" class="de.spring.example.aspects.BeforeMyAspect" />
+ -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="user" value="root"/>