問題
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034725.jpg)
缺點
裝飾器模式
代理模式
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034709.jpg)
缺點
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
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034731.jpg)
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034766.jpg)
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能干什麼
可以把這種需求作為獨立的方面很容易的實現
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034733.jpg)
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)
包圍一個連接點的增強
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320034707.jpg)
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27884.html