Assuming a Spring 3.0 environment, here is the summary:
- Create the aspect
- Create a Spring context file that declares AOP
- Use Spring to instantiate both the aspect and the application object
- Run your test case to prove it's working
package com.mybiz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component
public class MyAspect
{
// Flag indicating that a given pointcut was in fact invoked.
public boolean madeIntercept = false;
@Pointcut("execution(* com.mybiz.MyApp.myMethod(..))")
public void myMethodPointcut() {}
@After("myMethodPointcut()")
public void doSomething() { madeIntercept = true; }
}
Here's a simple Spring file, named spring-test-aspect.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <context:component-scan base-package="com.mybiz"/> <aop:aspectj-autoproxy/> </beans>
The aspect will automatically get Spring-managed since it uses the @Component annotation, and component scanning declared above includes its package. Use the same approach with your application object:
package com.mybiz;
@Component
public class MyApp
{
public void myMethod() {}
}
Filling in the method is irrelevant; all we're trying to do is prove that if that method is invoked, that the aspect will intercept the control flow afterwards. Here's a test case that does this for us:
package com.mybiz;
@ContextConfiguration(locations ={"file:spring-test-aspect.xml"})
public class MyAspectTest extends AbstractTestNGSpringContextTests
{
@Resource
private MyAspect myAspect;
@Resource
private MyApp myApp;
@PostConstruct
public void init() { assert myAspect != null; assert myApp != null; }
@Test
public void confirmInterception()
{
assert !myAspect.intercepted();
myApp.myMethod();
assert myAspect.intercepted();
}
}
There's the proof-of-concept; from here, you'd add real functionality to your application class and decorate that functionality with the aspect. I should offer a fair warning: the above snippets have not been actually compiled and run, rather simply copy-pasted with various names changed to be more general purpose (as such, it might not be totally correct). So, if you bump into any problems - you have my apologies, but I'm sure the problems will be trivial.
