JavaRush /Blog Jawa /Random-JV /Apa iku AOP? Dasar Pemrograman Berorientasi Aspek

Apa iku AOP? Dasar Pemrograman Berorientasi Aspek

Diterbitake ing grup
Hello wong lanang! Tanpa mangerteni konsep dhasar, cukup angel nyelidiki kerangka kerja lan pendekatan kanggo fungsi bangunan. Dadi dina iki kita bakal ngomong babagan salah sawijining konsep kasebut - AOP, utawa pemrograman berorientasi aspek . Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 1Iki dudu topik sing gampang lan ora asring digunakake kanthi langsung, nanging akeh kerangka lan teknologi nggunakake ing sangisore hood. Lan mesthi, kadhangkala sajrone wawancara, sampeyan bisa uga dijaluk ngandhani kanthi umum apa jenis kewan iki lan ing ngendi bisa digunakake. Dadi ayo ndeleng konsep dhasar lan sawetara conto prasaja AOP ing Jawa . Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 2Dadi, AOP - pemrograman berorientasi aspek - minangka paradigma sing ngarahake nambah modularitas macem-macem bagean aplikasi kanthi misahake keprihatinan cross-cutting. Kanggo nindakake iki, prilaku tambahan ditambahake menyang kode sing ana, tanpa ngganti kode asli. Ing tembung liyane, kita koyone nyumerepi fungsi tambahan ing ndhuwur cara lan kelas tanpa nggawe amandemen kanggo kode dipunéwahi. Yagene iki perlu? Cepet utawa mengko kita teka menyang kesimpulan sing biasanipun pendekatan obyek-oriented ora tansah èfèktif ngatasi masalah tartamtu. Ing wayahe, AOP teka ngluwari lan menehi alat tambahan kanggo mbangun aplikasi kasebut. Lan alat tambahan tegese tambah keluwesan ing pangembangan, amarga ana luwih akeh pilihan kanggo ngrampungake masalah tartamtu.

Aplikasi saka AOP

Pemrograman berorientasi aspek dirancang kanggo ngatasi masalah salib, sing bisa dadi kode sing diulang kaping pirang-pirang kanthi cara sing beda-beda, sing ora bisa ditata kanthi lengkap dadi modul sing kapisah. Patut, karo AOP kita bisa ninggalake iki ing njaba kode utama lan nemtokake vertikal. Conto yaiku aplikasi kabijakan keamanan ing aplikasi. Biasane, keamanan ngethok akeh unsur aplikasi. Kajaba iku, kabijakan keamanan aplikasi kudu ditrapake kanthi padha kanggo kabeh bagean aplikasi sing ana lan anyar. Ing wektu sing padha, kabijakan keamanan sing digunakake bisa berkembang dhewe. Iki ngendi panggunaan AOP bisa migunani . Uga conto liyane yaiku logging . Ana sawetara kaluwihan kanggo nggunakake pendekatan AOP kanggo logging dibandhingake karo nglebokake logging kanthi manual:
  1. Kode logging gampang dileksanakake lan dibusak: sampeyan mung kudu nambah utawa mbusak sawetara konfigurasi saka sawetara aspek.
  2. Kabeh kode sumber kanggo logging disimpen ing sak panggonan lan ora perlu nggoleki kabeh panggonan panggunaan kanthi manual.
  3. Kode sing dimaksudake kanggo logging bisa ditambahake ing endi wae, yaiku metode lan kelas sing wis ditulis utawa fungsi anyar. Iki nyuda jumlah kesalahan pangembang.
    Kajaba iku, nalika mbusak aspek saka konfigurasi desain, sampeyan bisa yakin manawa kabeh kode tilak dibusak lan ora ana sing ilang.
  4. Aspek minangka kode mandiri sing bisa digunakake maneh lan ditingkatake maneh.
Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 3AOP uga digunakake kanggo nangani pangecualian, caching, lan mbusak sawetara fungsi supaya bisa digunakake maneh.

Konsep dhasar AOP

Kanggo mindhah luwih ing analisis topik, ayo dadi kenalan karo konsep utama AOP. Saran minangka logika tambahan, kode, sing diarani saka titik sambungan. Saran bisa ditindakake sadurunge, sawise utawa tinimbang titik sambungan (liyane ing ngisor iki). Jenis saran sing bisa :
  1. Sadurunge (Sadurunge) - saran saka jinis iki diluncurake sadurunge eksekusi metode target - titik sambungan. Nalika nggunakake aspek minangka kelas, kita njupuk anotasi @Before kanggo menehi tandha jinis saran minangka sadurunge. Nalika nggunakake aspek minangka file .aj , iki bakal dadi cara sadurunge () .
  2. Sawise (Sawise) - saran sing dieksekusi sawise rampung eksekusi metode - titik sambungan, ing kasus normal lan nalika pengecualian dibuwang.
    Nalika nggunakake aspèk minangka kelas, kita bisa nggunakake @After anotasi kanggo nunjukaké sing iki tip sing teka sawise.
    Nalika nggunakake aspèk minangka file .aj , iki bakal dadi sawise () cara .
  3. Sawise Wangsul - tips iki dieksekusi mung yen cara target bisa digunakake kanthi normal, tanpa kesalahan.
    Nalika aspek diwakili minangka kelas, kita bisa nggunakake anotasi @AfterReturning kanggo menehi tandha yen saran wis dileksanakake sawise rampung.
    Nalika nggunakake aspèk minangka file .aj, iki bakal sawise () cara bali (Obyek obj) .
  4. Sawise Mbuwang - saran jinis iki ditrapake kanggo kasus kasebut nalika metode, yaiku, titik sambungan, mbuwang pengecualian. Kita bisa nggunakake saran iki kanggo sawetara nangani eksekusi gagal (contone, muter maneh kabeh transaksi utawa logging karo tingkat tilak dibutuhake).
    Kanggo kelas aspek, anotasi @AfterThrowing digunakake kanggo nunjukake yen saran iki digunakake sawise pangecualian dibuwang.
    Nalika nggunakake aspèk ing wangun file .aj , iki bakal cara - sawise () mbuwang (Istiméwa e) .
  5. Around mbok menawa salah siji saka jinis paling penting saka saran sing ngubengi cara, sing, titik sambungan, karo kang kita bisa, contone, milih arep nglakokaké cara titik sambungan diwenehi utawa ora.
    Sampeyan bisa nulis kode saran sing mlaku sadurunge lan sawise metode titik gabung dieksekusi.
    Tanggung jawab babagan saran kalebu nelpon metode titik gabung lan ngasilake nilai yen metode kasebut ngasilake. Sing, ing tip iki sampeyan mung bisa niru operasi saka cara target tanpa nelpon, lan bali soko dhewe minangka asil.
    Kanggo aspèk ing wangun kelas, kita nggunakake @Around anotasi kanggo nggawe tips sing mbungkus titik sambungan. Nalika nggunakake aspèk minangka file .aj , iki bakal watara () cara .
Titik gabung - titik ing program eksekusi (nelpon metode, nggawe obyek, ngakses variabel) ing ngendi saran kudu ditrapake. Ing tembung liyane, iki sawetara jinis ekspresi reguler, kanthi bantuan panggonan kanggo ngenalake kode (panggonan kanggo nglamar tips) ditemokake. Pointcut minangka sakumpulan titik sambungan . Motong nemtokake manawa titik sambungan sing diwenehake cocog karo tip sing diwenehake. Aspek minangka modul utawa kelas sing ngetrapake fungsi end-to-end. Aspek ngowahi prilaku kode liyane kanthi ngetrapake saran ing titik gabungan sing ditetepake dening sawetara irisan . Ing tembung liyane, iku kombinasi tips lan titik sambungan. Pambuka - ngganti struktur kelas lan / utawa ngganti hirarki warisan kanggo nambah fungsi aspek kanggo kode manca. Target minangka obyek sing bakal ditrapake saran. Tenun minangka proses ngubungake aspek karo obyek liyane kanggo nggawe obyek proxy sing disaranake. Iki bisa ditindakake ing wektu kompilasi, wektu mbukak, utawa wektu mbukak. Ana telung jinis tenun:
  • Compile-wektu weaving - Yen sampeyan duwe kode sumber saka aspek lan kode sing nggunakake aspèk, sampeyan bisa ngumpulake kode sumber lan aspek langsung nggunakake AspectJ compiler;
  • tenunan pasca kompilasi (tenunan binar) - yen sampeyan ora bisa utawa ora pengin nggunakake transformasi kode sumber kanggo nenun aspek menyang kode, sampeyan bisa njupuk kelas sing wis dikompilasi utawa kendi lan nyuntikake aspek;
  • Weaving wektu mbukak mung tenun binar ditundha nganti loader kelas mbukak file kelas lan nemtokake kelas kanggo JVM.
    Kanggo ndhukung iki, siji utawa luwih "weave class loaders" dibutuhake. Dheweke uga diwenehake kanthi jelas dening runtime utawa diaktifake dening "agen tenun."
AspectJ minangka implementasi spesifik paradigma AOP sing ngetrapake kemampuan kanggo ngatasi masalah lintas. Dokumentasi bisa ditemokake ing kene .

Tuladha ing basa Jawa

Sabanjure, kanggo luwih ngerti AOP, kita bakal ndeleng conto cilik tingkat Hello World. Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 4Ayo kula langsung nyathet yen ing conto kita bakal nggunakake tenun compile-time . Kaping pisanan, kita kudu nambah dependensi ing ngisor iki menyang pom.xml :
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.9.5</version>
</dependency>
Minangka aturan, compiler Ajs khusus digunakake kanggo nggunakake aspèk . IntelliJ IDEA ora nduweni kanthi gawan, dadi nalika milih minangka compiler aplikasi sampeyan kudu nemtokake path menyang distribusi AspectJ . Sampeyan bisa maca liyane babagan cara milih Ajs minangka compiler ing kaca iki. Iki minangka cara pisanan, lan sing kapindho (sing digunakake) yaiku nambahake plugin ing ngisor iki menyang pom.xml :
<build>
  <plugins>
     <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.7</version>
        <configuration>
           <complianceLevel>1.8</complianceLevel>
           <source>1.8</source>
           <target>1.8</target>
           <showWeaveInfo>true</showWeaveInfo>
           <verbose>true</verbose>
           <Xlint>ignore</Xlint>
           <encoding>UTF-8</encoding>
        </configuration>
        <executions>
           <execution>
              <goals>
                 <goal>compile</goal>
                 <goal>test-compile</goal>
              </goals>
           </execution>
        </executions>
     </plugin>
  </plugins>
</build>
Sawise iki, disaranake ngimpor maneh saka Maven lan mbukak mvn clean compile . Saiki ayo pindhah menyang conto.

Tuladha No. 1

Ayo nggawe kelas Utama . Ing kono kita bakal duwe titik peluncuran lan metode sing nyithak jeneng sing diterusake ing konsol:
public class Main {

  public static void main(String[] args) {
  printName("Толя");
  printName("Вова");
  printName("Sasha");
  }

  public static void printName(String name) {
     System.out.println(name);
  }
}
Ora ana sing rumit: dheweke ngliwati jeneng kasebut lan ditampilake ing konsol. Yen kita mbukak saiki, console bakal nampilake:
Tolya Vova Sasha
Nah, wektune kanggo njupuk kauntungan saka kekuwatan AOP. Saiki kita kudu nggawe aspek file . Padha teka ing rong jinis: pisanan file karo extension .aj , kaloro iku kelas biasa sing ngleksanakake kemampuan AOP nggunakake anotasi. Ayo ndeleng file kanthi ekstensi .aj :
public aspect GreetingAspect {

  pointcut greeting() : execution(* Main.printName(..));

  before() : greeting() {
     System.out.print("Привет ");
  }
}
Berkas iki meh padha karo kelas. Ayo ngerteni apa sing kedadeyan ing kene: pointcut - potongan utawa set titik sambungan; salam () - jeneng irisan iki; : eksekusi - nalika nglakokaké * - kabeh, nelpon - Main.printName (..) - cara iki. Sabanjure teka saran khusus - sadurunge () - sing dieksekusi sadurunge metode target diarani, : salam () - irisan sing ditanggepi saran iki, lan ing ngisor iki kita ndeleng awak metode kasebut, sing ditulis ing basa Jawa. basa ingkang kita mangertosi. Nalika kita mbukak utama kanthi aspek iki, kita bakal entuk output ing ngisor iki menyang konsol:
Hello Tolya Hello Vova Hello Sasha
Kita bisa ndeleng manawa saben telpon menyang metode printName wis diowahi kanthi aspek. Saiki ayo deleng apa aspek kasebut, nanging minangka kelas Jawa kanthi anotasi:
@Aspect
public class GreetingAspect{

  @Pointcut("execution(* Main.printName(String))")
  public void greeting() {
  }

  @Before("greeting()")
  public void beforeAdvice() {
     System.out.print("Привет ");
  }
}
Sawise file aspek .aj , kabeh luwih jelas:
  • @Aspect nuduhake yen kelas sing diwenehake minangka aspek;
  • @Pointcut ("eksekusi (* Main.printName (String))") iku titik potong sing murub ing kabeh panggilan menyang Main.printName karo argumen mlebu saka jinis String ;
  • @Sadurunge ("salam ()") - saran sing ditrapake sadurunge nelpon kode sing diterangake ing titik potong salam () .
Mlaku utama kanthi aspek iki ora bakal ngganti output konsol:
Hello Tolya Hello Vova Hello Sasha

Tuladha No. 2

Ayo kita duwe sawetara cara sing nindakake sawetara operasi kanggo klien lan nelpon metode iki saka utama :
public class Main {

  public static void main(String[] args) {
  makeSomeOperation("Толя");
  }

  public static void makeSomeOperation(String clientName) {
     System.out.println("Выполнение некоторых операций для клиента - " + clientName);
  }
}
Nggunakake anotasi @Around , ayo nindakake kaya "pseudo-transaction":
@Aspect
public class TransactionAspect{

  @Pointcut("execution(* Main.makeSomeOperation(String))")
  public void executeOperation() {
  }

  @Around(value = "executeOperation()")
  public void beforeAdvice(ProceedingJoinPoint joinPoint) {
     System.out.println("Открытие транзакции...");
     try {
        joinPoint.proceed();
        System.out.println("Закрытие транзакции....");
     }
     catch (Throwable throwable) {
        System.out.println("Операция не удалась, откат транзакции...");
     }
  }
  }
Nggunakake cara nerusake saka obyek ProceedingJoinPoint , kita nelpon cara pambungkus kanggo nemtokake panggonan ing Papan lan, miturut, kode ing cara ndhuwur joinPoint.proceed (); - iki Sadurunge , kang ngisor - Sawise . Yen kita mbukak utama, kita bakal entuk konsol:
Mbukak transaksi... Nindakake sawetara operasi kanggo klien - Tolya Nutup transaksi....
Yen kita nambah uncalan pangecualian kanggo metode kita (tiba-tiba operasi gagal):
public static void makeSomeOperation(String clientName)throws Exception {
  System.out.println("Выполнение некоторых операций для клиента - " + clientName);
  throw new Exception();
}
Banjur kita bakal entuk output ing console:
Mbukak transaksi... Nindakake sawetara operasi kanggo klien - Tolya Operasi gagal, transaksi digulung maneh...
Ternyata dadi pseudo-processing saka kegagalan.

Tuladha No. 3

Minangka conto sabanjure, ayo nglakoni kaya mlebu ing konsol. Pisanan, ayo goleki Main , ing ngendi logika bisnis pseudo kita kedadeyan:
public class Main {
  private String value;

  public static void main(String[] args) throws Exception {
     Main main = new Main();
     main.setValue("<некоторое meaning>");
     String valueForCheck = main.getValue();
     main.checkValue(valueForCheck);
  }

  public void setValue(String value) {
     this.value = value;
  }

  public String getValue() {
     return this.value;
  }

  public void checkValue(String value) throws Exception {
     if (value.length() > 10) {
        throw new Exception();
     }
  }
}
Utamane , nggunakake setValue, kita bakal nyetel nilai variabel internal - nilai , banjur nggunakake getValue, kita bakal njupuk nilai iki lan ing checkValue kita bakal mriksa apa nilai iki luwih saka 10 karakter. Yen ya, pangecualian bakal dibuwang. Saiki ayo goleki aspek sing bakal kita log operasi metode:
@Aspect
public class LogAspect {

  @Pointcut("execution(* *(..))")
  public void methodExecuting() {
  }

  @AfterReturning(value = "methodExecuting()", returning = "returningValue")
  public void recordSuccessfulExecution(JoinPoint joinPoint, Object returningValue) {
     if (returningValue != null) {
        System.out.printf("Успешно выполнен метод - %s, класса- %s, с результатом выполнения - %s\n",
              joinPoint.getSignature().getName(),
              joinPoint.getSourceLocation().getWithinType().getName(),
              returningValue);
     }
     else {
        System.out.printf("Успешно выполнен метод - %s, класса- %s\n",
              joinPoint.getSignature().getName(),
              joinPoint.getSourceLocation().getWithinType().getName());
     }
  }

  @AfterThrowing(value = "methodExecuting()", throwing = "exception")
  public void recordFailedExecution(JoinPoint joinPoint, Exception exception) {
     System.out.printf("Метод - %s, класса- %s, был аварийно завершен с исключением - %s\n",
           joinPoint.getSignature().getName(),
           joinPoint.getSourceLocation().getWithinType().getName(),
           exception);
  }
}
Apa sing kedadeyan ing kene? @Pointcut ("eksekusi (* * (..))") - bakal nyambung menyang kabeh telpon kanggo kabeh cara; @AfterReturning (value = "methodExecuting ()", returning = "returningValue") - saran sing bakal dieksekusi sawise metode target wis kasil rampung. Kita duwe rong kasus ing kene:
  1. Nalika metode nduweni nilai bali yen (returningValue! = null) {
  2. Nalika ora ana nilai bali liyane {
@AfterThrowing(value = "methodExecuting ()", mbuwang = "exception") - saran sing bakal micu ing cilik saka kesalahan, sing, nalika pangecualian dibuwang saka cara. Lan kanthi mangkono, kanthi mlaku main , kita bakal entuk jinis mlebu ing konsol:
Metode - setValue, saka kelas - Utama kasil dieksekusi. Metode - getValue, saka kelas - Utama, kasil dieksekusi, kanthi asil eksekusi - <sawetara nilai> Metode - checkValue, saka kelas - Utama, dipungkasi kanthi ora normal kanthi pengecualian - java.lang.Exception Method - main, class-Main, crash kanthi pengecualian - java.lang.Exception
Ya, amarga kita ora nangani pangecualian, kita uga bakal entuk stacktrace: Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 5Sampeyan bisa maca babagan pengecualian lan penanganan ing artikel iki: Pengecualian ing Jawa lan Pengecualian lan penanganane . Iku kabeh kanggo kula dina iki. Dina iki kita kenal karo AOP , lan sampeyan bisa ndeleng manawa kewan iki ora medeni kaya sing digambarake. Sugeng tanggap warsa!Apa iku AOP?  Dasar Pemrograman Berorientasi Aspek - 6
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION