
项目结构
/MySpringAop/src/service/CartService.java
package service;
public interface CartService {
public String findCartById(Long id);
public void deleteCart();
}
/MySpringAop/src/service/CartServiceImpl.java
package service;
public class CartServiceImpl implements CartService{
@Override
public String findCartById(Long id) {
System.out.println("CartServiceImpl.findCartById()");
return "cart";
}
@Override
public void deleteCart() {
System.out.println("CartServiceImpl.deleteCart()");
}
}
package aspect;
//自动调用
public class TimeAspect {
long startTime;
//得到起始时间
//@before
public void getStartTime()
{
startTime=System.currentTimeMillis();
}
//得到接收时间
public void getEndTime()
{
long endTime=System.currentTimeMillis();
System.out.println("运行时间:"+(endTime-startTime));
}
}
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import aspect.TimeAspect;
import service.CartService;
import service.CartServiceImpl;
public class MySpringAOP {
public static void main(String[] args) {
//1.得到动态代理对象
CartServiceImpl targetObject=new CartServiceImpl();
Object proxyObject=getProxyObject(targetObject);
//2.通过动态代理对象调用目标方法
CartService cartService=(CartService) proxyObject;
String result=cartService.findCartById(30L);
System.out.println(result);
System.out.println("===========");
cartService.deleteCart();
//3.java虚拟机会调用MyInvocationHandler中的invoke()
}
//得到动态代理对象
static Object getProxyObject(Object target)
{
//动态类
ClassLoader classLoader=target.getClass().getClassLoader();
Class<?>[] methodInfo=target.getClass().getInterfaces();
MyInvocationHandler handler=new MyInvocationHandler(target);
return Proxy.newProxyInstance(classLoader, methodInfo, handler);
}
//自动调用@before方法
static class MyInvocationHandler implements InvocationHandler{
//目标对象是cartServiceImpl对象
Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//调用@before方法
TimeAspect timeAspect=new TimeAspect();
timeAspect.getStartTime();
System.out.println("===开始执行===");
//调用目标方法
Object result = method.invoke(target, args);
System.out.println("===结束执行===");
timeAspect.getEndTime();
return result;
}
}
}
运行结果
===开始执行===
CartServiceImpl.findCartById()
===结束执行===
运行时间:1
cart
===========
===开始执行===
CartServiceImpl.deleteCart()
===结束执行===
运行时间:0