Este artículo contiene todos los ficheros de un sencillo proyecto de un ejemplo completo escrito a la par que se escribían estos artículos sobre programación orientada a aspectos.

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

  <aop:aspectj-autoproxy/>

  <bean id="secretaria" class="com.empresa.Secretaria"/>
  <bean id="espia" class="com.empresa.Espia"/>
  <bean id="grabadora" class="com.empresa.Grabadora"/>

</beans>

Secretaria.java:

package com.empresa;

public class Secretaria {

    public String conversacion(){
        return "bla, bla, bla";
    }

    public String pellizco(){
        throw new RuntimeException("¡pillín!");
    }
}

Espia.java:

package com.empresa;

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

@Aspect
public class Espia {

    @Pointcut("execution(public * conversacion(..))")
    public void anyConversacion() {}
}

Grabadora.java:

package com.empresa;

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

@Aspect
public class Grabadora {

    @AfterReturning(pointcut="com.empresa.Espia.anyConversacion()",
                    returning="cotilleo")
    public void grabarConversacion(Object cotilleo) {
        System.out.println(cotilleo);
    }

    @AfterThrowing(pointcut="execution(public * *(..))",
                   throwing="gritito")
    public void grabarGrititos(Exception gritito) {
        System.out.println(gritito);
    }
}

Main.java:

package com.empresa;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args){
        try{
            AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
            context.registerShutdownHook();
       
            Secretaria secretaria = context.getBean(Secretaria.class);
            secretaria.conversacion();
            secretaria.pellizco();

        }catch(Exception e){
        }
    }
}

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
             http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.empresa</groupId>
  <artifactId>ejemplo-poa</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <name>ejemplo-poa</name>

  <properties>
    <spring.version>3.1.1.RELEASE</spring.version>
    <aspectj-version>1.5.4</aspectj-version>
    <cglib-version>2.2.2</cglib-version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>${aspectj-version}</version>
    </dependency>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>${cglib-version}</version>
    </dependency>
  </dependencies>
</project>