AOP基礎

duruiyang603發表於2015-09-18
通過切點(Pointcut)找到目標物件(Target)連線點(Joinpoint)織入(Weaving)增強(Advice),得到代理類(Proxy)引介(Introduction)是一種特殊的增強,切面(Aspect)由切點和增強組成。

通過java 動態代理技術或者 GCLib動態代理技術將橫切程式碼動態織入到目標方法的相應位置。



JDK動態代理:

1業務介面及其實現類,業務要求在每個方法執行前後都執行效能監控
 class MyFavoritesBrandService implements IMyFavoritesBrandService{
  @Override
  public List<MyFavoritesBrandModel> queryMyFavoriteBrand(String brandId) throws Exception {
   //業務邏輯程式碼;
  }
 }

2橫切業務類,將橫切業務(前後效能監控程式碼)抽取到該類中:該類可以為任何介面實現織入效能監控的功能
 public class PerformanceHandler implements InvocationHandler {
  private Object target;
  public PerformanceHandler(Object target) {
   this.target = target;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   /*效能監控開始程式碼 */
   Object obj=method.invoke(target, args);
   /*效能監控結束程式碼*/
   return obj;
  }
 }

3呼叫業務邏輯
 @Test
 public void Test2() {
  IMyFavoritesBrandService target=new MyFavoritesBrandService (); //target
  PerformanceHandler handler=new PerformanceHandler(target);  //weaving
  IMyFavoritesBrandService proxy=Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), //介面
    handler);  //proxy
 
  proxy.queryMyFavoriteBrand("brandId");
 }

侷限是指南給介面建立代理例項



CGLib動態代理

1業務介面及其實現類,業務要求在每個方法執行前後都執行效能監控
 class MyFavoritesBrandService implements IMyFavoritesBrandService{
  @Override
  public List<MyFavoritesBrandModel> queryMyFavoriteBrand(String brandId) throws Exception {
   //業務邏輯程式碼;
  }
 }

2橫切業務類,將橫切業務(前後效能監控程式碼)抽取到該類中:該類可以為任何類實現織入效能監控的功能
 public class CglibProxy implements MethodInterceptor {
  private Enhancer enhancer = new Enhancer();
  public Object getProxy(Class clazz) {
   enhancer .setSuperclass(clazz); // 需要建立子類的類
   enhancer .setCallback(this);
   return enhancer .create(); // 動態建立子類例項
  }
//攔截父類所有的方法:obj是目標類的例項,method是目標類方法的反射物件,args是方法的動態入參,proxy是代理類例項
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
   /* 效能監控開始程式碼 */
   Object result = proxy.invokeSuper(obj, args); //通過代理類呼叫父類中的方法
   /* 效能監控結束程式碼 */
   return result;
  }
 }

3呼叫業務邏輯
 @Test
 public void Test2() {
  CglibProxy proxy = new CglibProxy ();
  MyFavoritesBrandService myFBService=(MyFavoritesBrandService )proxy.getProxy(MyFavoritesBrandService .class); //動態生成子類的方式建立代理類
  myFBService.queryMyFavoriteBrand("brandId");
 }






























相關文章