/**
*
*/
package com.doj.aopapp.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author Dinesh.Rajput
*
*/
@Aspect
@Component
public class LoggingAspect {
/**
* Declaring before advice
* @param jp
* @throws Throwable
*/
//@Before("execution(* com.doj.aopapp.service.*.*(..))") // before advice with pointcut expression directly
@Before("logForAllMethods()") //before advice with named pointcut that declared as name logForAllMethods()
public void beforeAdviceForAllMethods(JoinPoint jp) throws Throwable {
System.out.println("****LoggingAspect.beforeAdviceForAllMethods() " + jp.getSignature().getName());
}
/**
* Declaring before 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
*/
@Before("execution(* com.doj.aopapp.service.*.transfer(*,*,*))")
public void beforeAdviceForTransferMethods(JoinPoint jp) throws Throwable {
System.out.println("****LoggingAspect.beforeAdviceForTransferMethods() " + jp.getSignature().getName());
}
/**
* Declaring named pointcut
*/
@Pointcut("execution(* com.doj.aopapp.service.*.*(..))")
public void logForAllMethods(){}
}
@Before("execution(* com.doj.aopapp.service.*.*(..))")
@Before("execution(* com.doj.aopapp.service.*.transfer(*,*,*))")
/**
* Declaring named pointcut
*/
@Pointcut("execution(* com.doj.aopapp.service.*.*(..))")
public void logForAllMethods(){}
/**
* before advice with named pointcut that declared as name logForAllMethods()
*/
@Before("logForAllMethods()") //before advice with name pointcut that declared as name logForAllMethods()
public void beforeAdviceForAllMethods(JoinPoint jp) throws Throwable {
System.out.println("****LoggingAspect.beforeAdviceForAllMethods() " + 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) {
return new Double(50000);
}
@Override
public Long withdrawal(String account, Long 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);
System.out.println("Available balance: " +transferService.checkBalance("accountA"));
transferService.diposite("accountA", 50000l);
System.out.println("Withdrawal amount: " +transferService.withdrawal("accountB", 40000l));
applicationContext.close();
}
}

Labels: Spring AOP, Spring3.0, Spring4