国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

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

2024-07-14 08:43:35
字體:
供稿:網(wǎng)友

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

Spring,AOP,動態(tài)代理,代碼

圖中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();//    切入點和切面類結(jié)合//   三個參數(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();  }}

結(jié)果

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宕昌县| 南江县| 广饶县| 岚皋县| 白河县| 疏勒县| 石城县| 普格县| 浦县| 临清市| 育儿| 儋州市| 陈巴尔虎旗| 武威市| 恩平市| 康乐县| 祁连县| 汾西县| 凌海市| 南宁市| 门源| 威远县| 南昌县| 靖江市| 广平县| 安顺市| 随州市| 宣化县| 邳州市| 华蓥市| 西贡区| 静乐县| 杂多县| 凤台县| 嵊泗县| 定远县| 峨边| 扶沟县| 巩留县| 锡林浩特市| 肥城市|