欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼

 更新時間:2019年03月14日 12:02:09   作者:sweet_sauce  
今天小編就為大家分享一篇關于Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

什么是AOP我們先來看一張圖

圖中A就是通知,比如你要給每個方法前都加一個before()方法,目標類的每一個方法叫joinpoint(切入點),每個切入點都會用到通知,把通知和切入點連起來,點成線,線成面,這就是切面,也就是AOP,下面我們來簡單寫個小例子來實現(xiàn)一下

目標類的接口

public interface UserService {
  public void addUser() ;
  public void updateUser();
  public void deleteUser();
}

目標類接口的實現(xiàn)

public class UserServiceImpl implements UserService {
  @Override
  public void addUser() {
    System.out.println("addUser");
  }
  @Override
  public void updateUser() {
    System.out.println("updateUser");
  }
  @Override
  public void deleteUser() {
    System.out.println("deleteUser");
  }
}

通知類

public class MyAspect {
  public void before(){
    System.out.println("before");
  }
  public void after(){
    System.out.println("after");
  }
}

代理類

public class MyBeanFactory {
  public static UserService createService(){
    //1.目標類
    final UserService userService = new UserServiceImpl() ;
    //2.切面類
    final MyAspect myAspect = new MyAspect();
//    切入點和切面類結合
//   三個參數(shù)
//    1. loader ,類加載器 運行是加載,用類加載器將其加載到內(nèi)存
//    2. interfaces 代理類需要實現(xiàn)的所有接口
//    3. invocationHandler 處理類,一般采用匿名內(nèi)部類
//    提供了invoke方法 代理類每個方法執(zhí)行時都將調(diào)用一次invoke ,又有三個參數(shù)
//    1. Object proxy 代理對象
//    2. Method method 代理對象方法的反射
//    3. Object[] args 方法的實際參數(shù)
    UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
        userService.getClass().getInterfaces(),
        new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(method.getName());
            myAspect.before();
            Object obj = method.invoke(userService, args);
            myAspect.after();
            return obj ;
          }
        });
    return proxyService ;
  }
}

測試類

public class UserServiceImplTest {
  @org.junit.jupiter.api.Test
  public void demo() throws Exception {
      UserService userService = MyBeanFactory.createService();
      userService.addUser();
      userService.deleteUser();
      userService.updateUser();
  }
}

結果

addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0

我們可以看到每個方法都執(zhí)行了通知,用了動態(tài)代理就不用手動的給每個方法前后加入通知,這樣既節(jié)省了時間,也保證了主體代碼不被改變

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

相關文章

最新評論