1.jdk静态代理(静态代理和动态代理) 本质:在内存中构建出接口的实现类。
缺陷:只能对实现接口的类实现动态代理,
使用cglib可以对没有实现接口的类进行动态代理。
2.cglib动态代理 本质:生成被代理对象的子类。
静态代理:proxy_static包下的一个接口和两个实现类
Subject 有两个实现类一个是真实类(RealSubject),一个是代理对象类(ProxySubject),分别重写Subject的eat()方法following:
1 public class RealSubject implements Subject { 2 3 public void eat() { 4 System.out.println("real eat method begin~"); 5 } 6 7 }
//两种方式,分别是: 将真实对象暴露出来的方法 && 不将真实对象暴露出来的方法
1 public class ProxySubject implements Subject{ 2 private RealSubject realSubject; 3 public void eat() { 4 System.out.println("ProxySubject method begin~"); 5 realSubject.eat(); 6 System.out.println("ProxySubject method end~"); 7 } 8 public RealSubject getRealSubject() { 9 return realSubject; 10 } 11 public void setRealSubject(RealSubject realSubject) { 12 this.realSubject = realSubject; 13 } 14 //不将真实对象暴露出来 15 /*Subject realSubject = new RealSubject(); 16 public void eat() { 17 System.out.println("ProxySubject method begin~"); 18 realSubject.eat(); 19 System.out.println("ProxySubject method end~"); 20 }*/ 21 }
1 @Test 2 public void Proxy_Static(){ 3 //不将真实对象暴露出来的方法 4 // ProxySubject proxysubject = new ProxySubject(); 5 // 6 // proxysubject.eat(); 7 8 //将真实对象暴露出来的方法 9 RealSubject rs= new RealSubject(); 10 ProxySubject ps = new ProxySubject(); 11 ps.setRealSubject(rs); 12 ps.eat(); 13 14 }
jdk动态代理:
proxy_dynamic包下的一个接口和一个实现类
写法依然是最普通的写法,重点在测试类里面
测试如下
1 @Test 2 public void Proxy_jdk_Dynamic(){ 3 final IUserDao dao =new UserDaoImpl(); 4 Object instancedao = Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() { 5 public Object invoke(Object proxy, Method method, Object[] args) 6 throws Throwable { 7 System.out.println("增强 begin~"); 8 Object invoke = method.invoke(dao, args); 9 System.out.println("增强 end~"); 10 return invoke; 11 } 12 }); 13 System.out.println(((IUserDao)instancedao).add()); 14 }
cglib动态代理:
测试如下:
1 @Test 2 public void Proxy_cglib_Dynamic(){ 3 final Dog dog = new Dog(); 4 Enhancer enhancer = new Enhancer(); 5 enhancer.setSuperclass(dog.getClass()); 6 enhancer.setCallback(new MethodInterceptor() { 7 public Object intercept(Object proxy, Method method, Object[] arg2, 8 MethodProxy methodproxy) throws Throwable { 9 System.out.println("begin~"); 10 Object invoke = method.invoke(dog, arg2); 11 System.out.println("end~"); 12 return invoke; 13 } 14 }); 15 16 Dog dog2 =(Dog)enhancer.create(); 17 dog2.Say(); 18 19 }