代理模式
代理模式:
Spirng AOP就是基于代理模式实现的。代理模式是对目标对象功能的一种增强,让目标对象的功能更强大、完善。是一种切面编程,可以减少重复代码。
缺点:程序设计更复杂,增加了更多的类。
静态代理:
以硬编码的形式去代理指定的目标对象,代理类增强目标对象的功能。例如servie类的方法处理功能逻辑,然后调用dao操作数据库,调用后再做一些处理,service(代理类)增强了dao(目标对象)的功能。
缺点:违背开闭原则,不利于扩展。
动态代理:
一般是在框架层使用的比较多。
jdk动态代理:
是jdk提供的动态代理功能,基于反射机制,创新一个新的代理目标对象,动态调用原目标对象的方法实现
特点:使用jdk动态代理要求目标对象必须有实现过接口
缺点:使用反射机制,效率较低,性能较低
1 public class JdkDynamicProxy implements InvocationHandler { 2 /*private Object target; 3 4 public IPerson getInstance(Class clazz) { 5 this.target = person; 6 IPerson proxyPerson = (IPerson) Proxy.newProxyInstance(person.getClass().getClassLoader(), 7 person.getClass().getInterfaces(), this); 8 return proxyPerson; 9 }*/ 10 11 private Object o;//原目标对象 12 public Object getInstance(Class clazz){ 13 return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);//返回生成的新代理目标对象 14 } 15 16 @Override 17 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 18 System.out.println("前处理"); 19 Object result = method.invoke(this.o, args);//原目标对象调用方法 20 System.out.println(result.toString()); 21 System.out.println("end、、"); 22 return result; 23 } 24 25 public JdkDynamicProxy(Object o) { 26 this.o = o; 27 } 28 }
测试类:
public class DynamicProxyTest { public static void main(String[] args) { JdkDynamicProxy proxy = new JdkDynamicProxy(new ZhangSan());//拿到代理对象,并把目标对象通过构造函数设置进去 IPerson instance = (IPerson) proxy.getInstance(ZhangSan.class);//获取新的代理目标对象 instance.eat(11);//调用方法 } }
cglib动态代理:cglib是Spring提供的,使用的时候要引入cglib的jar包,生成新的对象是继承原目标对象,
优点:不要求实现接口,是个类就可以被使用代理,比jdk代理性能好