JavaRush /Java Blog /Random-TK /AOP näme? Aspekt-gönükdirilen programma esaslary

AOP näme? Aspekt-gönükdirilen programma esaslary

Toparda çap edildi
Salam oglanlar! Esasy düşünjelere düşünmän, gurluşyň işleýşine çarçuwalara we çemeleşmelere göz aýlamak gaty kyn. Şeýlelik bilen bu gün bu düşünjeleriň biri - AOP ýa-da aspektli programmirleme barada gürleşeris . AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 1Bu aňsat mowzuk däl we köplenç gönüden-göni ulanylmaýar, ýöne köp çarçuwalar we tehnologiýalar kapotyň aşagynda ulanýarlar. Elbetde, käwagt söhbetdeşlik wagtynda munuň haýsy haýwandygyny we nirede ulanyp boljakdygyny umumy manyda aýdyp bilersiňiz. Geliň, Java-daky esasy düşünjelere we AOP-yň käbir ýönekeý mysallaryna seredeliň . AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 2Şeýlelik bilen, AOP - aspektlere gönükdirilen programmirleme - kesiş aladalaryny aýyrmak arkaly programmanyň dürli bölekleriniň modullygyny ýokarlandyrmaga gönükdirilen paradigma. Munuň üçin asyl kody üýtgetmän, bar bolan koda goşmaça özüni alyp barmak goşulýar. Başga bir söz bilen aýdylanda, üýtgedilen koda üýtgetmeler girizmezden, goşmaça funksiýalary usullaryň we synplaryň üstünde goýýarys. Bu näme üçin zerur? Iru-giç adaty obýekte gönükdirilen çemeleşme hemişe käbir meseleleri netijeli çözüp bilmez diýen netijä gelýäris. Şeýle pursatda AOP kömege gelýär we programmany gurmak üçin goşmaça gurallary berýär. Goşmaça gurallar ösüşde çeýeligi ýokarlandyrmagy aňladýar, munuň netijesinde belli bir meseläni çözmek üçin has köp mümkinçilik bar.

AOP ulanylyşy

Aspekt-gönükdirilen programmirleme, dürli modulda doly gurlup bilinmeýän, dürli usullar bilen birnäçe gezek gaýtalanýan islendik kod bolup bilýän, kesişýän meseleleri çözmek üçin döredildi. Şoňa laýyklykda AOP bilen muny esasy koduň daşynda goýup, dikligine kesgitläp bileris. Mysal üçin, bir programmada howpsuzlyk syýasatynyň ulanylmagy. Adatça, programmanyň köp elementleri boýunça howpsuzlyk kesilýär. Mundan başga-da, programmanyň howpsuzlyk syýasaty programmanyň bar bolan we täze böleklerine deň derejede ulanylmalydyr. Şol bir wagtyň özünde, ulanylýan howpsuzlyk syýasatynyň özi ösüp biler. Bu ýerde AOP- yň ulanylmagy amatly bolup biler . Başga bir mysal, hasaba alyş . Logurnalda el bilen goýmak bilen deňeşdirilende, hasaba alynmak üçin AOP çemeleşmesini ulanmagyň birnäçe artykmaçlygy bar:
  1. Giriş koduny durmuşa geçirmek we aýyrmak aňsat: diňe bir tarapyň birnäçe konfigurasiýasyny goşmaly ýa-da aýyrmaly.
  2. Gingazgy üçin ähli çeşme kody bir ýerde saklanýar we ähli ulanylýan ýerleri el bilen tapmagyň zerurlygy ýok.
  3. Hasaba girmek üçin niýetlenen kod, eýýäm ýazylan usullar, synplar ýa-da täze funksiýa bolsun, islendik ýere goşup bolýar. Bu, döredijiniň ýalňyşlyklarynyň sanyny azaldar.
    Şeýle hem, dizaýn konfigurasiýasyndan bir tarapy aýyranyňyzda, ähli yz kodunyň aýrylandygyna we hiç zadyň ýokdugyna doly göz ýetirip bilersiňiz.
  4. Aspektler ýeke-täk kod bolup, ony gaýtadan ulanyp we kämilleşdirip bolýar.
AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 3AOP, gaýtadan ulanmak üçin kadadan çykma, keş we käbir funksiýalary aýyrmak üçin hem ulanylýar.

AOP-yň esasy düşünjeleri

Mowzugyň derňewinde has öňe gitmek üçin ilki bilen AOP-yň esasy düşünjeleri bilen tanyşalyň. Maslahat , baglanyşyk nokadyndan atlandyrylýan goşmaça logika, kod. Maslahat baglanyşyk nokadynyň öňünden, soňundan ýa-da ýerine ýerine ýetirilip bilner (aşakda has giňişleýin). Mümkin bolan maslahat görnüşleri :
  1. Öň (Öň) - maksatly usullar - baglanyşyk nokatlary ýerine ýetirilmezden ozal bu görnüşdäki maslahat berilýär. Aspektleri sapak hökmünde ulananymyzda, maslahat görnüşini öňküsi ýaly bellemek üçin @ Öňünden düşündiriş alýarys. Aspektleri .aj faýllary hökmünde ulananyňyzda , bu öňki () usul bolar .
  2. Soňra (Soň) - usullar ýerine ýetirilenden soň ýerine ýetirilýän maslahat - adaty ýagdaýlarda-da, kadadan çykma bolanda hem baglanyşyk nokatlary. Aspektleri synp hökmünde ulananymyzda, munuň soňundan gelýän maslahatdygyny görkezmek üçin @After
    düşündirişini ulanyp bileris . Aspektleri .aj faýllary hökmünde ulananyňyzda , bu () usuldan soň bolar .
  3. Yza gaýdyp gelenden soň - bu maslahatlar diňe maksatly usul ýalňyşsyz işlese ýerine ýetirilýär. Haçan-da aspektler synp hökmünde görkezilse, maslahaty üstünlikli gutarandan soň ýerine ýetiriljekdigini bellemek üçin @AfterReturning
    düşündirişini ulanyp bileris . Aspektleri .aj faýllary hökmünde ulananyňyzda, bu () obýektiň yzyna gaýdyp gelmek usuly bolar .
  4. Zyňandan soň - bu görnüşli maslahat, bir usul, ýagny baglanyşyk nokady kadadan çykma ýagdaýlary üçin niýetlenendir. Bu maslahaty şowsuz ýerine ýetirişiň käbirleri üçin ulanyp bileris (mysal üçin, ähli amallary yzyna gaýtarmak ýa-da zerur yz derejesi bilen hasaba almak).
    Aspekt synplary üçin, @AfterThrowing düşündiriş , bu maslahatyň kadadan çykma ulanylandan soň ulanylýandygyny görkezmek üçin ulanylýar. .Aj
    faýllary görnüşindäki taraplary ulananyňyzda , bu (-) zyňandan soň (e kadadan çykma) usul bolar .
  5. Töwereginde, belki-de, bir usuly gurşap alýan iň möhüm maslahatlaryň biri, ýagny baglanyşyk nokady bolup biler, meselem, berlen baglanyşyk usulyny ýerine ýetirip-etmezligi saýlap bileris.
    Birleşmek nokady usuly ýerine ýetirilmezden ozal we soň işleýän maslahat koduny ýazyp bilersiňiz. Maslahatyň
    jogapkärçiligi , birleşmek nokady usulyna jaň etmek we usul bir zat gaýtaryp berse bahalary yzyna gaýtarmakdyr. Thisagny, bu maslahatda maksatly usulyň işine jaň etmän öýkünip bilersiňiz we netijede özüňizden bir zady yzyna gaýtaryp bilersiňiz. Sapak görnüşindäki taraplar üçin, baglanyşyk nokadyny gurşap alýan maslahatlar döretmek üçin @Around düşündirişini ulanýarys. Aspektleri .aj faýllary hökmünde ulananyňyzda , bu () usuly bolar .
Goşulmak nokady - maslahat berilmeli ýerine ýetirilýän programmanyň nokady (usuly çagyrmak, bir obýekt döretmek, üýtgeýjä girmek). Başga sözler bilen aýdylanda, bu kod girizmek üçin ýerleri (maslahatlary ulanýan ýerler) tapylmagy bilen yzygiderli aňlatmagyň bir görnüşi. Nokat baglanyşyk nokatlarynyň toplumydyr . Kesilen, berlen baglanyşyk nokadynyň berlen maslahata laýyk gelýändigini kesgitleýär. Aspekt , ahyrky işlemegi amala aşyrýan modul ýa-da synpdyr. Bir tarap, käbir dilim bilen kesgitlenen birleşme nokatlarynda maslahat bermek arkaly koduň galan böleginiň özüni alyp barşyny üýtgedýär . Başgaça aýdylanda, bu maslahatlaryň we baglanyşyk nokatlarynyň utgaşmasydyr. Giriş - synpyň gurluşyny üýtgetmek we / ýa-da daşary ýurt koduna aspekt funksiýasyny goşmak üçin miras iýerarhiýasyny üýtgetmek. Maksat , maslahatyň ulanyljak obýektidir. Dokma , maslahat berilýän proksi obýektlerini döretmek üçin aspektleri beýleki obýektler bilen baglanyşdyrmak prosesi. Bu düzüliş wagty, ýük wagty ýa-da iş wagty edilip bilner. Dokmagyň üç görnüşi bar:
  • Kompil wagtlaýyn dokamak - Eger bir tarapyň deslapky kody we aspektleri ulanýan kody bar bolsa, deslapky kody we aspekti gönüden-göni AspectJ düzüjisini ulanyp düzüp bilersiňiz;
  • düzülenden soňky dokma (ikilik dokamak) - koduňyzyň taraplaryny dokamak üçin deslapky kod üýtgeşmelerini ulanyp bilmeýän bolsaňyz ýa-da islemeýän bolsaňyz, eýýäm düzülen sapaklary ýa-da bankalary alyp, sanjym aspektlerini alyp bilersiňiz;
  • köp wagtlyk dokamak , ikilik dokamak, synp ýükleýjisi synp faýlyny ýükleýänçä we JVM üçin synpy kesgitleýänçä yza süýşürilýär.
    Muny goldamak üçin bir ýa-da birnäçe "dokma synp ýükleýjileri" zerur. Olary iş wagty aç-açan üpjün edýär ýa-da "dokma agenti" işjeňleşdirýär.
AspectJ, kesişýän meseleleri çözmek ukybyny durmuşa geçirýän AOP paradigmalarynyň belli bir ýerine ýetirilişi . Resminamalary şu ýerden tapyp bilersiňiz .

Java-da mysallar

Indiki, AOP-a has gowy düşünmek üçin “Salam World” derejesindäki kiçijik mysallara serederis. AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 4Mysallarymyzda jemleýji dokma usulyny ulanjakdygymyzy derrew belläsim gelýär . Ilki bilen pom.xml -e aşakdaky garaşlylygy goşmaly :
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.9.5</version>
</dependency>
Düzgün bolşy ýaly, taraplary ulanmak üçin ýörite Ajs düzüjisi ulanylýar . IntelliJ IDEA deslapky görnüşde ýok, şonuň üçin programma düzüji hökmünde saýlanyňyzda AspectJ paýlanyşynyň ýoluny görkezmeli . Bu sahypada düzüji hökmünde Aj-lary saýlamagyň usuly barada has köp okap bilersiňiz. Bu birinji usuldy, ikinjisi (ulandym) pom.xml- a aşakdaky plugin goşmakdy :
<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>
Ondan soň, Mawenden täzeden import etmek we mvn arassa kompile işletmek maslahat berilýär . Indi mysallara geçeliň.

Mysal No.1

Esasy synp döredeliň . Onda başlangyç nokady we konsolda oňa geçen atlary çap edýän usul bolar:
public class Main {

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

  public static void printName(String name) {
     System.out.println(name);
  }
}
Çylşyrymly zat ýok: adyny geçip, konsolda görkezdiler. Häzir işlesek, konsol görkeziler:
Tolýa Wowa Saşa
Garaz, AOP güýjünden peýdalanmagyň wagty geldi. Indi faýl - aspekt döretmeli . Iki görnüşde gelýär: birinjisi .aj giňeltmesi bolan faýl , ikinjisi düşündirişler ulanyp AOP mümkinçiliklerini amala aşyrýan adaty synp . Ilki bilen .aj giňeltmesi bolan bir faýla seredeliň :
public aspect GreetingAspect {

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

  before() : greeting() {
     System.out.print("Привет ");
  }
}
Bu faýl klasa birneme meňzeýär. Geliň, bu ýerde nämeleriň bolup geçýändigini anyklalyň: nokat - kesilen ýa-da baglanyşyk nokatlarynyň toplumy; salamlaşmak () - bu dilimiň ady; : ýerine ýetiriş - ýerine ýetirilende * - hemmesi, jaň ediň - Main.printName (..) - bu usul. Indiki maksatly usul çagyrylmazdan ozal ýerine ýetirilýän ýörite maslahat gelýär : salamlaşmak () - bu maslahatyň täsir edýän bölegi, aşakda Java-da ýazylan usulyň mazmunyny görýäris. düşünýän dilimiz. Häzirki tarap bilen işleýänimizde , konsola aşakdaky çykyşy alarys:
Salam Tolya Salam Vova Salam Saşa
“PrintName” usulyna edilen her bir jaňyň bir tarapdan üýtgedilendigini görüp bileris . Indi aspektiň nähili boljakdygyna göz aýlalyň, ýöne düşündirişli Java synpy hökmünde:
@Aspect
public class GreetingAspect{

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

  @Before("greeting()")
  public void beforeAdvice() {
     System.out.print("Привет ");
  }
}
.Aj aspekt faýlyndan soň hemme zat has düşnükli:
  • @Aspect berlen synpyň bir tarapdygyny aňladýar;
  • @Pointcut (" ýerine ýetiriş (* Main.printName (String))" ) " Main "
  • @ Öňünden ("salamlaşmak ()") - gutlag () kesilen nokadynda beýan edilen kody çagyrmazdan ozal ulanylýan maslahat .
Bu tarap bilen esasy işlemek konsolyň çykyşyny üýtgetmez:
Salam Tolya Salam Vova Salam Saşa

Mysal No.2

Müşderiler üçin käbir amallary ýerine ýetirýän we bu usuly esasy diýip atlandyrýan käbir usulymyz bar diýeliň :
public class Main {

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

  public static void makeSomeOperation(String clientName) {
     System.out.println("Выполнение некоторых операций для клиента - " + clientName);
  }
}
@Around düşündirişini ulanyp , geliň “pseudo-transaction” ýaly bir zat edeliň:
@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("Операция не удалась, откат транзакции...");
     }
  }
  }
“ProceedingJoinPoint” obýektiniň dowam ediş usulyny ulanyp , tagtadaky ornuny kesgitlemek üçin örtügiň usulyna we şoňa görä ýokardaky usuldaky kody joinPoint.proceed () diýip atlandyrýarys; - bu öň , aşakda - Soň . Esasy işlesek, konsola gireris:
Geleşik açmak ... Müşderi üçin käbir amallary ýerine ýetirmek - Tolya Geleşigi ýapmak ....
Usulymyza kadadan çykma goşsak (birden operasiýa şowsuz):
public static void makeSomeOperation(String clientName)throws Exception {
  System.out.println("Выполнение некоторых операций для клиента - " + clientName);
  throw new Exception();
}
Soňra çykyşy konsolda alarys:
Geleşik açmak ... Müşderi üçin käbir amallary ýerine ýetirmek - Tolya Amal şowsuz boldy, geleşik yzyna gaýtaryldy ...
Şowsuzlygyň ýasama gaýtadan işlenmegi boldy.

Mysal No.3

Indiki mysal hökmünde, konsola girmek ýaly bir zat edeliň. Ilki bilen, ýasama iş logikamyzyň bolýan Maýna seredeliň :
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();
     }
  }
}
Esasan setValue ulanyp , içerki üýtgeýjiniň - bahasynyň bahasyny kesgitläris , soň getValue ulanyp, bu bahany alarys we CheckValue- da bu bahanyň 10 simwoldan has uzynlygyny barlarys. Hawa bolsa, kadadan çykma taşlanar. Indi usullaryň işleýşini haýsy tarapa ýazjakdygymyza seredeliň:
@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);
  }
}
Bu ýerde näme bolýar? @Pointcut ("ýerine ýetiriş (* * (..))") - ähli jaňlara ähli usullara birikdiriler; @AfterReturning (value = "methodExecuting ()", gaýdyp = "returnValue") - maksatly usul üstünlikli gutarandan soň ýerine ýetiriljek maslahat. Bu ýerde iki ýagdaý bar:
  1. Haçan-da bir usulyň yzyna gaýtaryş gymmaty bar bolsa (returnValue! = Null) {
  2. Haçan-da yzyna gaýtaryş gymmaty ýok bolsa {
@AfterThrowing (value = "methodExecuting ()", zyňmak = "kadadan çykma") - ýalňyşlyk ýüze çykanda, ýagny usuldan kadadan çykma ýüze çykjak maslahat. Şoňa görä-de, esasy işlemek bilen , konsola girmegiň bir görnüşini alarys:
Usul - setValue, synp - Main üstünlikli ýerine ýetirildi. Usul - getValue, synp - Main, ýerine ýetirilişiň netijesi bilen üstünlikli ýerine ýetirildi - <käbir baha> Usul - barlagValue, synpyň - Esasy, kadadan çykma bilen adatdan daşary ýatyryldy - java.lang.Exception usuly - esasy, synp-Main, kadadan çykma bilen ýykyldy - java.lang.Exception
Dogrusy, bu kadadan çykmany çözmändigimiz üçin, onuň ýazgysyny hem alarys: AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 5Kadadan çykmalar we olaryň ulanylyşy barada şu makalalarda okap bilersiňiz: Java-da kadadan çykmalar we kadadan çykmalar we olaryň ulanylyşy . Bu gün meniň üçin hemmesi. Bu gün AOP bilen tanyşdyk , bu haýwanyň boýalşy ýaly gorkunç däldigini görüp bilersiňiz. Hemmeler bilen hoşlaşyň!AOP näme?  Aspekt-gönükdirilen programmirlemegiň esaslary - 6
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION