問題
缺點
裝飾器模式
代理模式
缺點
Java代碼
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this
}
@Override
public Object invoke(Object proxy
//
Object retVal = method
//
return retVal;
}
public static Object proxy(Object target) {
return Proxy
target
}
}
[java]
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this
}
@Override
public Object invoke(Object proxy
//
Object retVal = method
//
return retVal;
}
public static Object proxy(Object target) {
return Proxy
target
}
}
編程模型
Java代碼
//proxy 在其上調用方法的代理實例
//method 攔截的方法
//args 攔截的參數
Override
public Object invoke(Object proxy
Object retVal=null;
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//反射調用目標對象的某個方法
retVal = method
}
//後處理
return retVal;
}
[java]
//proxy 在其上調用方法的代理實例
//method 攔截的方法
//args 攔截的參數
Override
public Object invoke(Object proxy
Object retVal=null;
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//反射調用目標對象的某個方法
retVal = method
}
//後處理
return retVal;
}
缺點
CGLIB動態代理解決方案(比較通用的解決方案)
Java代碼
public class MyInterceptor implements MethodInterceptor {
private Object target;
public MyInterceptor(Object target) {
this
}
@Override
public Object intercept(Object proxy
MethodProxy invocation) throws Throwable {
//
Object retVal = invocation
//
return retVal;
}
public static Object proxy(Object target) {
return Enhancer
}
}
[java]
public class MyInterceptor implements MethodInterceptor {
private Object target;
public MyInterceptor(Object target) {
this
}
@Override
public Object intercept(Object proxy
MethodProxy invocation) throws Throwable {
//
Object retVal = invocation
//
return retVal;
}
public static Object proxy(Object target) {
return Enhancer
}
}
編程模型
Java代碼
//proxy 在其上調用方法的代理實例 method攔截的方法 args 攔截的參數
//invocation 用來去調用被代理對象方法的
@Override
public Object intercept(Object proxy
MethodProxy invocation) throws Throwable {
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//調用目標對象的某個方法
Object retVal = invocation
}
//後處理
return retVal;
}
[java]
//proxy 在其上調用方法的代理實例 method攔截的方法 args 攔截的參數
//invocation 用來去調用被代理對象方法的
@Override
public Object intercept(Object proxy
MethodProxy invocation) throws Throwable {
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//調用目標對象的某個方法
Object retVal = invocation
}
//後處理
return retVal;
}
優點
缺點
動態代理本質
本質
最終表現為類(動態創建子類)
代理限制
只能在父類方法被調用之前或之後進行增強(功能的修改)
其他動態代理框架
jboss:javassist (hibernate
(hibernate
Java代碼
@Aspect
public class PayEbiAspect {
@Pointcut(value=
public void pointcut() {}
@Around(value=
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//
//
//
Object retVal = pjp
//
return retVal;
}
}
[java]
@Aspect
public class PayEbiAspect {
@Pointcut(value=
public void pointcut() {}
@Around(value=
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//
//
//
Object retVal = pjp
//
return retVal;
}
}
編程模型
Java代碼
//
@Pointcut(value=
public void pointcut() {}
//
@Around(value=
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object retVal=null;
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//調用目標對象的某個方法
retVal = pjp
}
//後處理
return retVal;
}
[java]
//
@Pointcut(value=
public void pointcut() {}
//
@Around(value=
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object retVal=null;
//預處理
//前置條件判斷
boolean ok = true;
if(!ok) {//不滿足條件
throw new RuntimeException(
}
else {//調用目標對象的某個方法
retVal = pjp
}
//後處理
return retVal;
}
缺點
AOP入門
概念
n關注點
n關注點分離
n橫切關注點
織入
nAOP是什麼(Aspect Oriented Programming)
AOP是一種編程范式
AOP為開發者提供了一種描述橫切關注點的機制
AOP能夠將那些與業務無關
nAOP能干什麼
可以把這種需求作為獨立的方面很容易的實現
AOP基本概念
連接點(Joinpoint)
表示需要在程序中插入橫切關注點的擴展點
切入點(Pointcut)
選擇一組相關連接點的模式
增強(Advice)
在連接點上執行的行為
方面/切面(Aspect)
橫切關注點的模塊化
目標對象(Target Object)
需要被織入橫切關注點的對象
AOP代理(AOP Proxy)
AOP框架使用代理模式創建的對象
織入(Weaving)
織入是一個過程
引入(inter
也稱為內部類型聲明
AOP的Advice類型
前置增強(Before advice)
在某連接點之前執行的增強
後置返回增強(After returning advice)
在某連接點正常完成後執行的增強
後置異常增強(After throwing advice)
在方法拋出異常退出時執行的增強
後置最終增強(After (finally) advice)
當某連接點退出的時候執行的增強(不論是正常返回還是異常退出)
環繞增強(Around Advice)
包圍一個連接點的增強
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27884.html