Spring Aop底层原理Proxy和InvocationHandler
用InvocationHandler和Proxy实现动态代理:
1、编写被代理的类实现指定接口:
@Component("userService")
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//在下面方法前面加逻辑
public void HelloWorld(){
System.out.println("helloworld");
}
}
2、编写实现InvocationHandler的类
public class AopProxyImpl implements InvocationHandler{
//声明在invoke方法里面用到的全局变量
private Object proxyObj;
public void setProxyObj(Object proxyObj) {
this.proxyObj = proxyObj;
}
//重写InvocationHandler
@Override
public Objectinvoke(Object proxy, Method method, Object[] args)
throws Throwable {
//加入自己的逻辑
this.LogBefore();
//实现要执行方法本体
//参数1、被代理对象
method.invoke(proxyObj, args);
return null;
}
//执行方法前的逻辑方法
public void LogBefore(){
System.out.println("MethodBefore");
}
}
3、编写测试类在实现前面完成在实现前面加上自己的逻辑
//执行代理
@Test
public void TestProxy(){
//new一个被代理的对象
UserService userService = new UserServiceImpl();
//new一个实现InvocationHandler的接口
AopProxyImpl Proxyobj = new AopProxyImpl();
//将被代理对象通过set方法赋值到代理对象
Proxyobj.setProxyObj(userService);
//通过Proxy的newProxyInstance方法得到一个代理对象
//参数解析:
//1、被代理对象的ClassLoader
//2、被代理对象实现的接口
//3、实现InvocationHandler的类
UserService userSeviceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), Proxyobj);
//用返回来的对象调用相关的方法
userSeviceProxy.HelloWorld();
}