动态代理
动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
1,基于接口--JDK动态代理【我们在这里使用】
2,基于类:cglib
3,Java字节码实现:javasist
需要了解两个类:Proxy :代理,InvocatioHandler:调用处理程序
InvocationHandler是由代理实例调用处理程序实现的接口。
每个代理实例都有一个关联的调用处理程序,当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。
proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
动态代理的好处
可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
公共业务交给代理角色,实现了业务的分工
公共业务发生扩展的时候,方便集中管理
一个动态代理类代理的是一个接口,一般就是对应的一类业务
一个动态代理类可以代理多个类,只要时实现了同一个接口即可
代码
1 package com.nic.PeopleService; 2 3 public interface PeopleService { 4 public void add(); 5 public void delete(); 6 public void update(); 7 public void query(); 8 }
1 package com.nic.PeopleService; 2 3 public class PeopleServiceImpl implements PeopleService { 4 public void add() { 5 System.out.println("People增"); 6 } 7 8 public void delete() { 9 System.out.println("People删"); 10 } 11 12 public void update() { 13 System.out.println("People改"); 14 } 15 16 public void query() { 17 System.out.println("People查"); 18 } 19 }
1 package com.nic.Handler; 2 3 import org.springframework.cglib.proxy.InvocationHandler; 4 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Proxy; 7 8 //自动生成代理类的类 9 public class ProxyInvocationHandler implements InvocationHandler, java.lang.reflect.InvocationHandler { 10 //被代理的接口(这里可以看成PeopleService) 11 private Object target; 12 13 public void setTarget(Object target) { 14 this.target = target; 15 } 16 17 //生成得到代理的类 18 public Object getProxy(){ 19 return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); 20 } 21 22 //处理代理实例,并返回接口 23 public Object invoke(Object o, Method method, Object[] objects) throws Throwable { 24 proInvoke(); 25 //动态代理的本质,就是使用反射机制! 26 Object result = method.invoke(target, objects); 27 aftInvoke(); 28 return result; 29 } 30 31 public void proInvoke(){ 32 System.out.println("代理前处理事情"); 33 } 34 public void aftInvoke(){ 35 System.out.println("代理后处理事情"); 36 } 37 }
1 import com.nic.Handler.ProxyInvocationHandler; 2 import com.nic.PeopleService.PeopleService; 3 import com.nic.PeopleService.PeopleServiceImpl; 4 5 public class Test { 6 public static void main(String[] args) { 7 //真实角色 8 PeopleService peopleService = new PeopleServiceImpl(); 9 //代理角色,不存在 10 ProxyInvocationHandler handler = new ProxyInvocationHandler(); 11 //设置要代理的对象 12 handler.setTarget(peopleService); 13 //动态生成代理类 14 PeopleService proxy = (PeopleService) handler.getProxy(); 15 proxy.add(); 16 17 } 18 }