Thursday, May 24, 2007

Problem: cannot find symbol constructor TestCase()

I was struggling with a strange problem for a few days. Now I found partially the reason of the problem. A very simple test class didn't compile in my project:


import junit.framework.TestCase;

public class MyTest extends TestCase {
public void testMe() {
assertTrue(true);
}
}

Read More...

Saturday, May 19, 2007

Introduction to AspectJ 5 with Spring and JavaConfig

Using the articles about JavaConfig in Guice vs. Spring JavaConfig: A comparison of DI styles and Simplifying Enterprise Applications with Spring 2.0 and AspectJ I managed to use aspectj configured with spring in java code only, that is without using xml files.


import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class HelloFromAspectJ {
@Pointcut("execution(* main(..))")
public void mainMethod() {}

@AfterReturning("mainMethod()")
public void sayHello() {
System.out.println("Hello from AspectJ!");
}
}

Here is the ordinary java class which is adviced by the above aspect:

public class HelloService {
public void main() {
System.out.println("Hello World!");
}
}

And here is the configuration class, which replaced the spring's configuration xml file:

import org.springframework.config.java.annotation.Configuration;
import org.springframework.config.java.annotation.Bean;
import org.springframework.config.java.context.AnnotationApplicationContext;
import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator;
import org.springframework.context.ApplicationContext;

@Configuration
public class SpringConfig {
@Bean
public HelloService helloService() {
return new HelloService();
}
@Bean
public HelloFromAspectJ helloFromAspectJ() {
return new HelloFromAspectJ();
}
@Bean
public AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator() {
return new AnnotationAwareAspectJAutoProxyCreator();
}

public static void main(String[] args) {
ApplicationContext ctx = new AnnotationApplicationContext(SpringConfig.class);
HelloService helloService = (HelloService) ctx.getBean("helloService");
helloService.main();
}
}

Note that the bean AnnotationAwareAspectJAutoProxyCreator is the enabler of annotated aspects in spring. It has the same function as the
<aop:aspectj-autoproxy/>
element in the spring's xml configuration.

Read More...