/**
*
*/
package com.doj.aopapp.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author Dinesh.Rajput
*
*/
@Aspect
@Component
public class LoggingAspect {
/**
* Declaring After Throwing advice
* @param jp
* @throws Throwable
*/
//@AfterThrowing("execution(* com.doj.aopapp.service.*.*(..))") // After Throwing advice with pointcut expression directly
@AfterThrowing(pointcut = "logForAllMethods()" , throwing="exc") //After Throwing advice with name pointcut that declared as name logForAllMethods()
public void afterThrowingAdviceForAllMethods(JoinPoint jp, Exception exc) throws Throwable {
System.out.println("****LoggingAspect.afterThrowingAdviceForAllMethods() " + jp.getSignature().getName() +" Exception: "+exc);
}
/**
* Declaring After Throwing advice for all transfer methods whose taking three arguments of any type
* of all classes in the package com.doj.aopapp.service
* @param jp
* @throws Throwable
*/
@AfterThrowing(pointcut = "execution(* com.doj.aopapp.service.*.transfer(*,*,*))", throwing="exc")
public void afterThrowingAdviceForTransferMethods(JoinPoint jp, Exception exc) throws Throwable {
System.out.println("****LoggingAspect.afterThrowingAdviceForTransferMethods() " + jp.getSignature().getName() +" Exception: "+exc);
}
/**
* Declaring named pointcut
*/
@Pointcut("execution(* com.doj.aopapp.service.*.*(..))")
public void logForAllMethods(){}
}
@AfterThrowing(pointcut = "logForAllMethods()" , throwing="exc")
@AfterThrowing(pointcut = "execution(* com.doj.aopapp.service.*.transfer(*,*,*))", throwing="exc")
<properties>
<spring.version>4.3.7.RELEASE</spring.version>
<aspectj.version>1.8.9</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
/**
*
*/
package com.doj.aopapp.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* @author Dinesh.Rajput
*
*/
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages={"com.doj.aopapp.aspect", "com.doj.aopapp.service"})
public class AppConfig {
}
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}
<!-- Enable @AspectJ annotation support -->
<aop:aspectj-autoproxy/>
/**
*
*/
package com.doj.aopapp.service;
/**
* @author Dinesh.Rajput
*
*/
public interface TransferService {
void transfer(String accountA, String accountB, Long amount);
Double checkBalance(String account);
Long withdrawal(String account, Long amount);
void diposite(String account, Long amount);
}
/**
*
*/
package com.doj.aopapp.service;
import org.springframework.stereotype.Service;
/**
* @author Dinesh.Rajput
*
*/
@Service
public class TransferServiceImpl implements TransferService {
@Override
public void transfer(String accountA, String accountB, Long amount) {
System.out.println(amount+" Amount trasferring from "+accountA+" to "+accountB);
throw new NullPointerException("Opps something went wrong!!!");
}
@Override
public Double checkBalance(String account) {
System.out.println("Available balance: 50000");
return new Double(50000);
}
@Override
public Long withdrawal(String account, Long amount) {
System.out.println("Withdrawal amount: " +amount);
return amount;
}
@Override
public void diposite(String account, Long amount) {
System.out.println(amount+" Amount has been diposited to "+account);
}
}
/**
*
*/
package com.doj.aopapp.test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.doj.aopapp.config.AppConfig;
import com.doj.aopapp.service.TransferService;
/**
* @author Dinesh.Rajput
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
TransferService transferService = applicationContext.getBean(TransferService.class);
transferService.checkBalance("accountA");
transferService.transfer("accountA", "accountB", 50000l);
transferService.diposite("accountA", 50000l);
transferService.withdrawal("accountB", 40000l);
applicationContext.close();
}
}

Labels: Spring AOP, Spring3.0, Spring4