spring aop原理 ,动态代理的两种方式jdk和cglib
jdk动态代理通过动态的生成代理对象完成事务,其中代理对象和被代理对象实现的是同一个接口,
其中代理对象可以用匿名内部类,也可以再建一个新的类.
例子:
实体类的创建
public interface Person {
public String sing(String name);
public String dance(String name);
}
被代理对象实现接口
public class AoLiGei implements Person{
@Override
public String sing(String name) {
System.out.println("他唱"+name+"歌");
return "AoLiGei唱歌";
}
@Override
public String dance(String name) {
System.out.println("他跳"+name+"舞");
return "AoLiGei跳舞";
}
}
新建一个动态代理
public class WangZongProxy {
private Person person = new AoLiGei();
public Person creatProxy(){
return (Person)Proxy.newProxyInstance(Person.class.getClassLoader(),person.getClass().getInterfaces(),new MethodHandler(person));
}
}
newProxyInstance()方法
public static Object newProxyInstance(
ClassLoader loader, //获取类加载器
Class>[] interfaces, //获取类的所有接口
InvocationHandler h) //实现该接口,在实现方法中完成操作(被代理对象需完成的操作)
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
新建一个MethodHandler实现invoke方法
public class MethodHandler implements InvocationHandler {
private Person target;
public MethodHandler(Person target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
System.out.println("方法"+methodName+"被调用");
if (methodName.equals("sing")){
System.out.println("唱歌了");
System.out.println("定金300");
String rusalt=(String)method.invoke(target,args);
return rusalt+"尾款400";
}
return null;
}
}
测试
public class Testproxy {
public static void main(String[] args) {
//创建代理对象类
WangZongProxy wangZongProxy = new WangZongProxy();
//创建动态代理对象
Person person = wangZongProxy.creatProxy();
String result = person.sing("伤不起");
System.out.println(result);
}
}



