I have written simple Aspect with primitive Pointcut and Advise method:
@Aspect
public class MyAspect {
@Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))")
public void someMethodInvoke() { }
@AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult")
public void decrementProductCount(List<String> comparisonResult) {
//some actions
}
}
I have following Spring annotation-based application config:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
//...
}
And utility class in com.mtag.util package:
public class SomeUtil {
static List<String> someMethod(List<String> oldList, List<String> newList) {
//...
}
}
but when I call
SomeUtil.someMethod(arg1, arg2);
in unit test I can see that method call is not intercepted and my @AfterReturning advise is not working.
But if i change someMethod() type to instance (non-static) method, pointcut to
@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))")
and manage SomeUtil bean by Spring by adding @Component annotation and call target metod like this:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class)
public class SomeUtilTest {
@Autowired
private SomeUtil someUtil;
@Test
public void categoriesDiffCalc() {
List<String> result = someUtil.someMethod(...);
}
}
Everything is OK.
In what way I can set an Advice for static method?
Actually there is no solutions to intercept static methods using auto proxy in spring framework. You should use the LWT AspectJ solution.
In a nutshell you should use the same annotations but with some additional configuration.
1) add to the spring context file next line:
<context:load-time-weaver/>
(may be in your situation it is not necessary)
2) unfortunately you should also add META-INF/aop.xml. Example:
<weaver>
<include within="com.example.ClassA"/> <!-- path to concrete class -->
<include within="com.log.* "/> <!—- path to aspects package -->
</weaver>
<aspects>
<aspect name="com.log.AspectA"/>
</aspects>
3) when starting JVM the argument
-javaagent:${PATH_TO_LIB }/aspectjweaver.jar
should be added.
So this solution is rather laborious.
For more information read 7.8.4 chapter here http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With