mybatis中用了很多設計模式,其中mappr接口調用使用了動態代理:java
代理設計模式
性能更高數組
直接經過類加載器 對類的字節文件進行修改安全
類加載器:將磁盤中的文件經過io流加載到內存中。加載到內存中才能對類進行修改。mybatis
代理通常使用CGLIBProxyapp
不要忘記導入jar包 asm cglib javassist性能
一個類表明另外一個類,建立現有對象的對象,以便向外界提供功能接口。 向在訪問這個類的時候作一些控制的時候可使用代理模式 增長中間層,實現與被代理類的組合。this
優勢----爲何時候代理模式spa
職責清晰 高擴展性 智能化設計
當你在訪問一個對象的時侯想要對這個類進行一些控制,(裝飾者模式是加強功能)
提供了對目標對象另外的訪問方式。經過代理對象來訪問目標對象,好處:能夠在目標對象的基礎上增長額外的功能來擴展目標對象的功能。
當你想要對要使用的對象進行修改的時候,不要直接在源碼上進行修改,而是使用代理工廠的模式 使用代理類來實現你想的功能
應用
解決類太多的問題
繼承:不宜與擴展
聚合(使用接口的方式):一個類A中有另一個類B的對象(接口),兩個類實現相同的接口,可是在一個類A中調用的是另外一個類B的方法。 A就是B的一個代理,由於在A中調用的方法是B的方法
實現動態的編譯
一個代理類 和 觸發人 實現接口 一個代理類只有一個功能
實現動態代理模式的方式有兩種:
依賴jdk的Proxy對象下的newProxyInstance()
cglib字節碼修改器實現代理
public Object createProxy(Object target){ this.obj = target; Enhancer enhancer = new Enhancer(); //設置被代理對象目標 enhancer.setSuperclass(this.obj.getClass()); //回調 調用下面的intercept(..)方法 enhancer.setCallback(this); enhancer.setClassLoader(target.getClass().getClassLoader()); return enhancer.create();
Target t = new Target(); MyProxy my = new MyProxy(); Target t2 = (Target) my.createProxy(t); t2.getMsg("sdsf");