How to declare Before and After Advice using @AspectJ


This example shows how to use annotations to write an aspect using @AspectJ feature which was introduced in AspectJ 5. With this we do not need to define the advices and pointcuts in XML file.

In following example we have written an aspect named OurAspect.java which contains two advices named ourBeforeAdvice() and ourAfterAdvice().

ourBeforeAdvice() is a before-advice called every time before a method starts its execution and ourAfterAdvice() is a after-advice called every time after a method completes its execution.

Steps:

1) Write EmployeeService interface and its implementation EmployeeServiceImpl.
2) Write MainApp class which use methods of  EmployeeService interface.
3) Write aspect class named OurAspect.java using annotations.
4) Enabling @AspectJ support in XML file

Technologies Used
1) Spring-framework-3.0.6.RELEASE
2) Eclipse Java EE IDE Helios Release (Eclipse version 3.6)
3) Java SE 6




Code


EmployeeService.java
package examples.springaop.anno;

public interface EmployeeService{
  
    public void addEmployee();
    public String getEmployeebyName(String id);
  
}

EmployeeServiceImpl.java

package examples.springaop.anno;

public class EmployeeServiceImpl implements EmployeeService{
   
    public void addEmployee(){
       
        System.out.println("addEmployee() called ! One Employee Added !");
    }
    public String getEmployeebyName(String id){
       
        String empName = "Name"+id;
        return empName;
       
    }
   
}

MainApp.java

package examples.springaop.anno;

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



public class MainApp{
public static void main(String args[]){
   
    ApplicationContext appContext = new ClassPathXmlApplicationContext("resources/ApplicationContext.xml");
    EmployeeService empService = (EmployeeService)appContext.getBean("empService");
   
    empService.addEmployee();
}
}

OurAspect.java

package examples.springaop.anno;

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

@Aspect
public class OurAspect{

@Pointcut("execution(* examples.springaop.xml.EmployeeService.addEmployee(..))")
public void addEmpPointcut(){
   
}

@Before("addEmpPointcut()")
 public void ourBeforeAdvice(){
     System.out.println("\n\nThis is Before Advice, called before the method.\n");
   
 }

@After("addEmpPointcut()")
public void ourAfterAdvice(){
    System.out.println("\nThis is After Advice, called after the method.");
   
 }
}

Here we have used @Aspect annotation on class OurAspect  to declare it as an aspect.

Next we have used @Pointcut annotation to declare pointcuts. @Pointcut is declared on methods. Here method names will be treated as pointcut ids, similar to what we do in :

tag.(see example).

We have used @Before and @After annotations to mark before and after advices respectively.

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<bean id="empService" class="examples.springaop.anno.EmployeeServiceImpl"/>

<bean id="empAspect" class="examples.springaop.anno.OurAspect"/>

<aop:aspectj-autoproxy/>

</beans>

For enabling @AspectJ support we have added following in XML file.

<aop:aspectj-autoproxy/>

This will create proxies for the methods which are specified in pointcuts so that advice logic would be called before/after the method execution.

Note here pointcuts and advices are not defined in XMl file.

Output
This is Before Advice, called before the method.

addEmployee() called ! One Employee Added !

This is After Advice, called after the method.


Jars Used

org.springframework.context-3.0.6.RELEASE.jar
org.springframework.core-3.0.6.RELEASE.jar
org.springframework.beans-3.0.6.RELEASE.jar
commons-logging-1.1.1.jar
org.springframework.asm-3.0.6.RELEASE.jar
org.springframework.aop-3.0.6.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
org.springframework.expression-3.0.6.RELEASE.jar
aspectjweaver-1.6.8.jar



I would like to know your comments and if you liked the article then please share it on social networking buttons.


No comments:

Post a Comment