/** * */ package com.doj.aopapp.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; 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 Returning advice * @param jp * @throws Throwable */ //@AfterReturning("execution(* com.doj.aopapp.service.*.*(..))") // After Returning advice with pointcut expression directly @AfterReturning("logForAllMethods()") //After Returning advice with name pointcut that declared as name logForAllMethods() public void afterReturningAdviceForAllMethods(JoinPoint jp) throws Throwable { System.out.println("****LoggingAspect.afterReturningAdviceForAllMethods() " + jp.getSignature().getName()); } /** * Declaring After Returning 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 */ @AfterReturning("execution(* com.doj.aopapp.service.*.transfer(*,*,*))") public void afterReturningAdviceForTransferMethods(JoinPoint jp) throws Throwable { System.out.println("****LoggingAspect.afterReturningAdviceForTransferMethods() " + jp.getSignature().getName()); } /** * Declaring named pointcut */ @Pointcut("execution(* com.doj.aopapp.service.*.*(..))") public void logForAllMethods(){} }
@AfterReturning("execution(* com.doj.aopapp.service.*.*(..))")
@AfterReturning("execution(* com.doj.aopapp.service.*.transfer(*,*,*))")
/** * Declaring named pointcut */ @Pointcut("execution(* com.doj.aopapp.service.*.*(..))") public void logForAllMethods(){} //After Returning advice with name pointcut that declared as name logForAllMethods() @AfterReturning("logForAllMethods()") public void afterReturningAdviceForAllMethods(JoinPoint jp) throws Throwable { System.out.println("****LoggingAspect.afterReturningAdviceForAllMethods() " + jp.getSignature().getName()); }
<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 has been tranfered 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.transfer("accountA", "accountB", 50000l); transferService.checkBalance("accountA"); transferService.diposite("accountA", 50000l); transferService.withdrawal("accountB", 40000l); applicationContext.close(); } }
Labels: Spring AOP, Spring3.0, Spring4