靜態代理是爲了在代理類的前後加上各種需要的東西国产激情久久久久久熟女老人AV,而且還不改變其本身的方法a片在线看亚洲亚洲精品久久一区二区三区,實現方法就是在其父類的接口下重新創建一個類亚洲中文无码AV在线观看,來實現要代理的類的父類欧美日韩精品一区二区三区高清视频,然後重寫方法(重寫是爲了方法名一樣久久青青无码AV亚洲黑人,返回值類型和參數一樣)久久青青无码AV亚洲黑人欧美日韩精品一区二区三区高清视频,在內部調用其被代理類的方法亚洲精品一区二区三区四区久久,在前後加上事物国产激情久久久久久熟女老人AV69堂无码国产精品视频,日志久久国产露脸老熟女熟69,時間之類
接口
package com.sxt.dao;public interface UserDao { public void save() throws Exception;}123456
被代理的類
package com.sxt.dao.impl;import com.sxt.dao.UserDao;public class UserDaoimpl implements UserDao { public void save() throws Exception { System.out.println("调用了save方法保存"); }}1234567891011
代理類
package com.sxt.dao.impl;import com.sxt.dao.UserDao;public class UserProxy implements UserDao { private UserDao dao; public void save() throws Exception { System.out.println("事物久久青青无码AV亚洲黑人,权限亚洲精品一区二区三区四区久久欧美日韩精品一区二区三区高清视频, 日志开启"); dao.save(); System.out.println("事物亚洲中文无码AV在线观看亚洲精品久久一区二区三区a片在线看亚洲,权限亚洲精品一区二区三区四区久久,日志关闭"); } public UserDao getDao() { return dao; } public void setDao(UserDao dao) { this.dao = dao; }}12345678910111213141516171819
调用的时候直接调用代理類欧美日韩精品一区二区三区高清视频国产激情久久久久久熟女老人AV久久青青无码AV亚洲黑人,代理類内部会调用被代理的類亚洲精品一区二区三区四区久久先锋五月婷婷丁香草草, 并且前后加了一些东西国产激情久久久久久熟女老人AV先锋五月婷婷丁香草草, 这就是靜態代理的实现方法
動態代理 :为了解决靜態代理每有一个被代理類就要创建一个代理類的弊端亚洲精品一区二区三区四区久久久久国产露脸老熟女熟69先锋五月婷婷丁香草草,出现了動態代理久久国产露脸老熟女熟69,動態代理是把所有东西都抽取出来了
接口
package com.sxt.dao;public interface UserDao { public void save() throws Exception;}123456
被代理的類
package com.sxt.dao.impl;import com.sxt.dao.UserDao;public class UserDaoimpl implements UserDao { public void save() throws Exception { System.out.println("调用了save方法保存"); }}1234567891011
動態代理類:基于兄弟类
package com.sxt.util;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyProxy implements InvocationHandler { private Object target;// 被代理者 public Object getProxy(Object o) { this.target=o;//o就是传过来的被代理者 /** * 第一个参数:this.getClass().getClassLoader() - 定义代理類的类加载器 第二个参数:interfaces - 被代理類的父类的接口 第三个参数:h - 指派方法调用的调用处理程序(应该是谁来代理) */ return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } //调用代理類的代理方法 Object proxy 谁来代理 Method method 方法 Object[] args 参数 public Object invoke(Object proxy,Method method,Object[] args) throws Exception{ System.out.println("事物开启"); //target 被代理的那个类 args 要什么参数 Object b返回值 Object b = method.invoke(target, args);//执行你要执行的方法亚洲精品一区二区三区四区久久亚洲中文无码AV在线观看,前后为事物控制 System.out.println("事物结束"); return b; }}12345678910111213141516171819202122232425262728293031
測試
package com.sxt.test;import com.sxt.dao.UserDao;import com.sxt.dao.impl.UserDaoimpl;import com.sxt.util.MyProxy;public class Test { public static void main(String[] args) { /** * 動態代理 */ UserDao dao = new UserDaoimpl();//被代理的对象 MyProxy dt = new MyProxy(); Object proxy = dt.getProxy(dao);//返回出来的就是代理類久久国产露脸老熟女熟69a片在线看亚洲69堂无码国产精品视频,只是这个代理類不用你创建欧美日韩精品一区二区三区高清视频先锋五月婷婷丁香草草亚洲精品久久一区二区三区,而是系统给你创建好了 try { dt.invoke(proxy,dao.getClass().getDeclaredMethod("save", null), null); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }}123456789101112131415161718192021222324252627282930313233
基于父类实现動態代理: cglib動態代理. 本质上动态生成了一个被代理目标的子类(要求被代理類不是final修饰的类)久久国产露脸老熟女熟69久久青青无码AV亚洲黑人,通过多态实现功能的加强久久青青无码AV亚洲黑人亚洲中文无码AV在线观看欧美日韩精品一区二区三区高清视频,当访问代理中的方法时亚洲中文无码AV在线观看a片在线看亚洲, 委派给MethodInteceptor中的处理程序(intercept方法)进行出来国产激情久久久久久熟女老人AV, 在处理程序中添加了业务逻辑和回掉了被代理目标中的方法久久青青无码AV亚洲黑人久久国产露脸老熟女熟69。
添加cglib-2.2.2.jar
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>12345
動態代理
package com.sxt.util;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class MyProxy1 implements MethodInterceptor { private Object target; public Object getProxy(Object target){ Enhancer enhancer = new Enhancer(); //1.设置基类 enhancer.setSuperclass(target.getClass()); //2.设置回调接口 enhancer.setCallback(this);//MethodInterceptor实现类 //3.创建動態代理 return enhancer.create(); } public Object intercept(Object proxy, Method m, Object[] os, MethodProxy mp) throws Throwable { Object o = m.invoke(target, os); return o; }}1234567891011121314151617181920212223242526272829
測試
package com.sxt.test;import com.sxt.dao.UserDao;import com.sxt.dao.impl.UserDaoimpl;import com.sxt.util.MyProxy1;/** * 用子类做代理 * @author Administrator * */public class Test2 { public static void main(String[] args) { UserDao dao = new UserDaoimpl(); MyProxy1 dt = new MyProxy1(); Object proxy = dt.getProxy(dao); try { dt.intercept(proxy, dao.getClass().getDeclaredMethod("save", null), null,null); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (Throwable e) { e.printStackTrace(); } }}123456789101112131415161718192021222324252627
和上面那個兄弟類出面做事情差不多亚洲精品一区二区三区四区久久,只是設置的時候不一樣而已