spring aop动态代理
aop的底层是动态代理,如果实现了接口就是采用jdk的动态代理技术,如果没有实现接口就是采用cglib动态代理技术
jdk动态代理是基于接口实现的
cglib动态代理是基于继承实现的
被代理对象类:
public class Person {
public String sing(String name) {
System.out.println("被代理对象 小明唱"+name+"歌");
return "被代理对象 飞吻";
}
public String dance(String name) {
System.out.println("被代理对象 小明跳"+name+"舞");
return "被代理对象 嗨起来了";
}
}
cglib代理代码实现块
public class ProxyFactory implements MethodInterceptor {
//准备被代理对象
private Person person = new Person();
/**
* 创建被代理对象
*
* @return
*/
public Person creatProxy() {
//1.准备cglib类库
Enhancer enhancer = new Enhancer();
//2.设置代理对象的父类
enhancer.setSuperclass(person.getClass());
//3.设置回调函数
enhancer.setCallback(this);
//4.创建代理对象
return (Person) enhancer.create();
}
/**
* 代理对象每个方法调用的时候都会触发
* 拦截的方法
*
* @param o 代理对象
* @param method 调用的方法
* @param objects 调用方法传递的参数
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o , Method method , Object[] objects , MethodProxy methodProxy) throws Throwable {
if (method.getName().equals("sing")) {
System.out.println("代理对象 接收预约金10W");
//让被代理对象执行自己的操作
Object result = method.invoke(person , objects);
System.out.println("代理对象 收尾款50W");
return result;
}else {
System.out.println("代理对象 接收预约金20W");
//让被代理对象执行自己的操作
Object result = method.invoke(person , objects);
System.out.println("代理对象 收尾款100W");
return result;
}
}
}
测试
public class ProxyTest {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
Person person = proxyFactory.creatProxy();
person.sing("山歌");
}
}
理解
个人理解,仅供参考