SpringLTW, improvements about ordering when weaving
authorGustavo Martin Morcuende <gu.martinm@gmail.com>
Sat, 16 Apr 2016 20:26:01 +0000 (22:26 +0200)
committerGustavo Martin Morcuende <gu.martinm@gmail.com>
Sat, 16 Apr 2016 20:26:01 +0000 (22:26 +0200)
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/MyAdvice.java [deleted file]
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/annotation/beforeInitTransactional.java [new file with mode: 0644]
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/BeforeMyAspect.java [new file with mode: 0644]
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspect.java [new file with mode: 0644]
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspectsOrder.java [new file with mode: 0644]
SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/web/Test.java
SpringJava/AOP/SpringLTW/src/main/resources/META-INF/aop.xml
SpringJava/AOP/SpringLTW/src/main/resources/spring-config.xml

diff --git a/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/MyAdvice.java b/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/MyAdvice.java
deleted file mode 100644 (file)
index 6e25974..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-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();
-    }
-}
diff --git a/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/annotation/beforeInitTransactional.java b/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/annotation/beforeInitTransactional.java
new file mode 100644 (file)
index 0000000..724f5a0
--- /dev/null
@@ -0,0 +1,15 @@
+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 {
+
+}
diff --git a/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/BeforeMyAspect.java b/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/BeforeMyAspect.java
new file mode 100644 (file)
index 0000000..2ca1814
--- /dev/null
@@ -0,0 +1,21 @@
+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.");
+    }
+}
diff --git a/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspect.java b/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspect.java
new file mode 100644 (file)
index 0000000..742c483
--- /dev/null
@@ -0,0 +1,33 @@
+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();
+    }
+}
diff --git a/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspectsOrder.java b/SpringJava/AOP/SpringLTW/src/main/java/de/spring/example/aspects/MyAspectsOrder.java
new file mode 100644 (file)
index 0000000..6e67dd7
--- /dev/null
@@ -0,0 +1,11 @@
+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 {
+
+}
index 5cd7d2a..4238a9f 100644 (file)
@@ -3,6 +3,7 @@ package de.spring.example.web;
 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;
 
@@ -33,6 +34,7 @@ public class Test {
     
     // 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.");
index 2345268..a5e58ae 100644 (file)
@@ -17,7 +17,9 @@
     </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>
index ffb978c..1a9edfb 100644 (file)
                                                   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"/>