国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

輕松掌握Java代理模式

2019-11-26 13:49:00
字體:
來源:轉載
供稿:網友

和大家一起聊一聊java代理模式

1、靜態代理

1.1靜態代理的代理類和和被代理的類都要維護一個共同的接口。 

public interface IUserDao {  void save();} 

1.2被代理的類,目標對象 

public class UserDao implements IUserDao{  @Override  public void save() {    System.out.println("-----已經保存數據!!!------");  }} 

1.3代理對象 

public class UserDaoProxy implements IUserDao{  // 接收保存目標對象  private IUserDao target;  public UserDaoProxy(IUserDao target) {    this.target = target;  }  @Override  public void save() {    System.out.println("開始事務...");    target.save();       // 執行目標對象的方法    System.out.println("提交事務...");  }}

1.4測試類 

public class App {  public static void main(String[] args) {    // 目標對象    IUserDao target = new UserDao();    // 代理    IUserDao proxy = new UserDaoProxy(target);    proxy.save(); // 執行的是,代理的方法  }}

2、動態代理

2.1同樣的,動態代理也需要完成一個接口。(同上)

2.2目標對象也是相同的。

2.3只是在代理對象上有所不同 

public class ProxyFactory {  // 維護一個目標對象  private Object target;  public ProxyFactory(Object target){    this.target = target;  }  // 給目標對象,生成代理對象   public Object getProxyInstance() {    return Proxy.newProxyInstance(        target.getClass().getClassLoader(),         target.getClass().getInterfaces(),        new InvocationHandler() {          @Override          public Object invoke(Object proxy, Method method, Object[] args)              throws Throwable {            System.out.println("開啟事務");            // 執行目標對象方法            Object returnValue = method.invoke(target, args);              System.out.println("提交事務");            return returnValue;          }        });  }}

2.4測試類 

public class App {  public static void main(String[] args) {    // 目標對象    IUserDao target = new UserDao();    System.out.println(target.getClass());    // 給目標對象,創建代理對象    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();    System.out.println(proxy.getClass());    // 執行方法  【代理對象】    proxy.save();  }}

3、cglib代理

3.1cglib代理不需要完成接口,只需要寫被代理的類和代理類即可,此處被代理類同1.2,所以不再編寫。

3.2代理類有所不同,用到cglib代理模式需要引用spring的核心框架包。 

public class ProxyFactory implements MethodInterceptor{  // 維護目標對象  private Object target;  public ProxyFactory(Object target){    this.target = target;  }  // 給目標對象創建代理對象  public Object getProxyInstance(){    //1. 工具類    Enhancer en = new Enhancer();    //2. 設置父類    en.setSuperclass(target.getClass());    //3. 設置回調函數    en.setCallback(this);    //4. 創建子類(代理對象)    return en.create();  }  @Override  public Object intercept(Object obj, Method method, Object[] args,      MethodProxy proxy) throws Throwable {    System.out.println("開始事務.....");    // 執行目標對象的方法    Object returnValue = method.invoke(target, args);    System.out.println("提交事務.....");    return returnValue;  }}

3.3測試類 

public class App {  public static void main(String[] args) {    // 目標對象    UserDao target = new UserDao();    System.out.println(target.getClass());    // 代理對象    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();    System.out.println(proxy.getClass());    // 執行代理對象的方法    proxy.save();  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 封丘县| 河北区| 安义县| 泾阳县| 临沂市| 新野县| 馆陶县| 沙河市| 新兴县| 襄汾县| 萨迦县| 乡城县| 炎陵县| 诏安县| 宁晋县| 建瓯市| 东台市| 进贤县| 汶上县| 澄迈县| 青河县| 军事| 彰化市| 大洼县| 阳曲县| 佛学| 临武县| 长泰县| 元阳县| 张家界市| 秦皇岛市| 鄢陵县| 军事| 乌审旗| 巴东县| 林芝县| 青神县| 福贡县| 崇仁县| 汾西县| 乌恰县|