1、AOP 测试类
package com.aop.aspect;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AopAspectTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
//从容器中获取beanService
MyService myService1 = context.getBean(MyService.class);
myService1.doBusiness("张君宝");
}
}
2、业务类
package com.aop.aspect;
import org.springframework.stereotype.Component;
@Component
public class MyService {
public void doBusiness(String name) {
System.out.println("【目标对象】执行业务方法,欢迎:" + name + "!");
}
}
3、切面类
package com.aop.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
@Aspect
public class MyAspect {
//@Pointcut("bean(myService)") //拦截spring容器中名称为myService的bean
//切向MyService下的所有方法
@Pointcut("execution(* com.aop.aspect.MyService..*(..))")
public void pc() {
}
@Before("pc()")
public void beforeAdvice(JoinPoint jp) {
String methodName = jp.getSignature().getName();
List<Object> args = Arrays.asList(jp.getArgs());
System.out.println("【代理对象】调用方法:" + methodName + ",参数:" + args);
}
@Around("pc()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.nanoTime();
System.out.println("【代理对象】myAspect @Around环绕通知开始");
Object result = joinPoint.proceed();
System.out.println("【代理对象】myAspect @Around环绕通知结束;总耗时:" + (System.nanoTime() - startTime) + "纳秒");
return result;
}
@After("pc()")
public void after() {
System.out.println("【代理对象】myAspect @After通知!");
}
@AfterReturning("pc()")
public void afterReturning() {
System.out.println("【代理对象】myAspect @AfterReturning通知!");
}
@AfterThrowing("pc()")
public void afterThrowing() {
System.out.println("【代理对象】myAspect @AfterThrowing通知!");
}
}
4、配置类
package com.aop.aspect;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
//@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class BeanConfig {
}
5、打印输出
【代理对象】myAspect @Around环绕通知开始
【代理对象】调用方法:doBusiness,参数:[张君宝]
【目标对象】执行业务方法,欢迎:张君宝!
【代理对象】myAspect @Around环绕通知结束;总耗时:20970100纳秒
【代理对象】myAspect @After通知!
【代理对象】myAspect @AfterReturning通知!