jdk動態**
// 返回**物件
proxy
.newproxyinstance
(classloader loader,
class
<
?>
inte***ces,
invocationhandler h);
// 通過執行物件呼叫目標物件的方法,增強的邏輯是寫invocationhandler的例項在invoke()
//loader:目標類的類載入器,**生成後,編譯,重新動態load.class到jvm;
//inte***ces:目標類的所有介面,獲得**的方法;
//h:實現invocationhandler介面類的例項,重寫invoke,執行者
/**
* 目標類介面
* * @author xw
* @date 2019/9/23 23:55
*/public
inte***ce
person
/** * 目標被**類
* * @author xw
* @date 2019/9/23 23:56
*/public
class
guojiang
implements
person
}/**
* 媒婆執行增強類
* * @author xw
* @date 2019/9/24 11:13
*/public
class
meipo
implements
invocationhandler
/** * 所有**物件執行介面方法都會被攔截,邏輯增強也是在此
* 媒婆類就是執行者,jdk生成的**物件,實際呼叫執行者來增強邏輯
** @param proxy **物件的引用
* @param method 方法物件
* @param args 方法引數
* @return 方法的返回值
* @throws throwable
*/@override
public
object
invoke
(object proxy,
method method,
object
args)
throws
throwable
}
cglib動態**/**
* 目標學生類
* * @author xw
* @date 2019/9/24 14:02
*/public
class
student
}/**
* 執行類
* * @author xw
* @date 2019/9/24 14:02
*/public
class
proxystudent
implements
methodinterceptor
/** * 方法攔截,增強
** @param obj 目標物件引用
* @param method 執行的方法物件
* @param args 方法引數
* @param proxy **物件引用
* @return 方法的返回值
* @throws throwable
*/@override
public
object
intercept
(object obj,
method method,
object
args,
methodproxy proxy)
throws
throwable
}
總結
動態**本質是位元組碼重組
jdk的動態**是基於介面的,通過介面進行強制轉換的生成以後的**物件。[**物件 extends proxy implement 目標類介面]cglib的動態**基於繼承子父類關係,通過生成乙個被**物件的子類,然後重寫父類的方法,生成的物件,可以強制轉換為被**物件(也就是用自己寫的類),子類引用賦值給父類。
隱藏複雜的邏輯處理過程,只關心執行結果。
簡單工廠
/**
* @author xw
* @date 2019/8/2 22:06
* 計算器最頂層介面
*/public
inte***ce
operation
/** * @author xw
* @date 2019/8/2 22:23
* 運算工廠類
*/public
class
operationfactory
}}
工廠方法/**
* 工廠方法
* * @author xw
* @date 2019/9/24 16:01
*/public
class
bmwfactory
}
抽象工廠/**
* 抽象工廠
* * @author xw
* @date 2019/9/24 15:46
*/public
abstract
class
abstractfactory
else
if(name ==
null
)return
null;}
}/**
* 具體工廠實現
* * @author xw
* @date 2019/9/24 16:01
*/public
class
bmwfactory
extends
abstractfactory
}/**
* 預設工廠
* * @author xw
* @date 2019/9/24 16:05
*/public
class
defaultfactory
extends
abstractfactory
}//客戶端呼叫
public
static
void
main
(string
args)
從上到下(宣告前,使用後)
先屬性(成員),後方法
先靜態,後非靜態
先父類,後子類
父類的靜態字段——>父類靜態**塊——>子類靜態字段——>子類靜態**塊——>
父類成員變數(非靜態字段)——>父類非靜態**塊——>父類構造器——>子類成員變數——>子類非靜態**塊——>子類構造器
//懶漢式(靜態內部類)
//即解決安全問題,又解決了效能問題
public
class
singleton4
//3、同樣提供靜態方法獲取例項//final 確保別人不能覆蓋
public
static
final
singleton4
getinstance()
}}
/**
* 執行的事
* * @author xw
* @date 2019/9/24 16:59
*/public
inte***ce
iexector
/** * 具體執行者
* * @author xw
* @date 2019/9/24 16:59
*/public
class
exectora
implements
iexector
public
static
void
main
(string
args)
}/**
* 委託人
* * @author xw
* @date 2019/9/24 17:00
*/public
class
dispatcherexctor
implements
iexector
@override
public
void
dosomething()
}public
static
void
main
(string
args)
工廠模式是生產固定的產品,針對具體的結果(產品);
委派模式針對的是具體的執行者,只需要滿足執行標準(實現相同的介面)
工廠模式返回的乙個例項物件,關心的是bean;
委派模式是具體執行方法,關心的是方法。
工廠模式可以看做固定的委派模式
1、最終執行結果是固定的。
2、執行過程和執行邏輯不一樣。
1、首先有乙個原型。
2、資料內容相同,但物件例項不同(完全兩個不同的記憶體位址)。
Spring的設計模式
spring詳解 spring中使用的設計模式也很多,比如 工廠模式 bean配置檔案 單例模式 實現ioc的時候,給每個類其實就實現出了乙個例項 模版模式 就是在父類中定義演算法的主要流程,而把一些個性化的步驟延遲到子類中去實現,父類始終控制著整個流程的主動權,子類只是輔助父類實現某些可定製的步驟...
Spring 中的設計模式
spring 的常用註解 required 該註解應用於設值方法 autowired 該註解應用於有值設值方法 非設值方法 構造方法和變數。qualifier 該註解和 autowired 搭配使用,用於消除特定 bean 自動裝配的歧義。簡單介紹一下 spring bean 的生命週期 bean ...
Spring中的設計模式
1.簡單工廠 實現方式 beanfactory。2.工廠方法 實現方式 factorybean介面。3.單例模式 實現方式 bean預設單例。getsingleton方法使用synchronized 雙重判空 4.介面卡模式 實現方式 springmvc中的介面卡handleradatper。5.模...