/**
*
*/
package com.doj.aopapp.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
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 around advice
* @param jp
* @throws Throwable
*/
//@Around("execution(* com.doj.aopapp.service.*.*(..))") // around advice with pointcut expression directly
@Around("logForAllMethods()") //around advice with name pointcut that declared as name logForAllMethods()
public void aroundAdviceForAllMethods(ProceedingJoinPoint jp) throws Throwable {
System.out.println("****Before advised method execution "+jp.getSignature().getName()+" LoggingAspect.aroundAdviceForAllMethods()");
jp.proceed();
System.out.println("****After advised method execution "+jp.getSignature().getName()+" LoggingAspect.aroundAdviceForAllMethods()" );
System.out.println();
}
/**
* Declaring around 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
*/
@Around("execution(* com.doj.aopapp.service.*.transfer(*,*,*))")
public void aroundAdviceForTransferMethods(ProceedingJoinPoint jp) throws Throwable {
System.out.println("****Before advised method execution "+jp.getSignature().getName()+" LoggingAspect.aroundAdviceForTransferMethods()");
jp.proceed();
System.out.println("****After advised method execution "+jp.getSignature().getName()+" LoggingAspect.aroundAdviceForTransferMethods()" );
System.out.println();
}
/**
* Declaring named pointcut
*/
@Pointcut("execution(* com.doj.aopapp.service.*.*(..))")
public void logForAllMethods(){}
}
@Around("execution(* com.doj.aopapp.service.*.*(..))")
@Around("execution(* com.doj.aopapp.service.*.transfer(*,*,*))")
<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);
}
@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