Eger mesele üçin AOP ulanylmagy iň gowy çemeleşme diýip karar edildi, Spring AOP ýa-da AspectJ ulanmaly, şeýle hem, haýsy stiiliň saýlanmaly - Aspect dil stili, @AspectJ bellik stiili ýa-da Spring XML stilimi? Bu saýlaw programmasynyň talaplaryna, ösüş mümkinçiliklerine we toparyň AOP bilen tanyşlygyna bagly.
Spring AOP ýa-da doly göwrümli AspectJ?
Işleýän iň ýönekeý çözgüdi ulanyň. Spring AOP, doly işli AspectJ-den has ýönekeýdir, sebäbi AspectJ-däki birleşdiriji/çaplaýjy kompýuteriň ösüş we ýygnama amallarynyň içine girizilmegi zerur däldir. Eger diňe Spring bean-larynda hereketleriň ýerine ýetirilmesini dolandyrmaly bolsaňyz, Spring AOP dogry saýlawdyr. Eger Spring konteýneriniň dolanşygynda bolmadyk obýektlere maslahat bermeli bolsaňyz (meselem, meýdan obýektleri ýaly), onda AspectJ ulanmaly. Şeýle hem, methodlaryň ýerine ýetirilişine degişli bolmadyk baglanyşyk nokatlaryna maslahat bermek üçin AspectJ ulanmaly.
Eger siz AspectJ ulansaňyz, onda AspectJ dil sintaksisi (keýpi kody stili diýilýär) bilen @AspectJ stili edilip saýlap bilersiňiz. Aç-açan, eger Java 5+ ulanmanyňyzda, eýýäm saýlaw edilendir: Kod stilini ulanyň. Eger aspektler proýektde möhüm rol oýnaýan bolsa we siz Eclipse üçin AspectJ Development Tools (AJDT) plaginini ulanyp bilseňiz, AspectJ dil sintaksisi has gowy wariantdyr. Bu has arassa we ýönekeýdir, çünki bu dil aspektleri ýazmak üçin ýörite döredilendir. Eger siz Eclipse ulanmaýan bolsaňyz ýa-da programma az möhüm rol oýnaýan birnäçe aspektiňiz bolsa, onda IDE-de adaty Java replatformasyna ýapyşyp, ýygnama skriptine aspekt baglanyşygyny goşup, @AspectJ stilini ulanyp bilersiňiz.
@AspectJ ýa-da Spring AOP üçin XML?
Eger siz Spring AOP ulanmaga karar etdiňiz bolsa, onda @AspectJ ýa-da XML stili saýlap bilersiňiz. Muňa dürli kompromisleri göz öňünde tutmaly.
XML stili häzirki Spring ulanyjylaryna has tanyş bolup biler we hakyky POJO goldanýar. Korporatiw hyzmatlary konfigurirlemek üçin AOP ulanylanda, XML gowy wariant bolup biler (ýeterlik barlamak, eger siz döwümli sözlemiň konfigurasiýanyňyzyň bir bölegi hasap ediň, diýip jogap berip bilseňiz, aýdyň bolar). XML stili bilen konfigurasiýaňyzda ýene-de aýdyň bolar, haýsy aspektleriň ulgamda bardygyny.
XML stiliniň iki kemçiligi bar. Birinjisi, ol ýerine ýetirýän wadany bir ýerde doly inkapsulýasiýa etmeýär. "Özüňe gaýtala" (Don’t repeat yourself/DRY) prinsipi, her bilimiň sistema çäklerinde ýeke-täk, gapma-garşylykly däl we awtoritehli keşbine eýe bolmalydygyny aýdýar. XML stilini ulanyňyzda, wezipesi nirede geçirilýär diýen bilim, esasy bin klassynyň yglan edilşi bilen konfigurasiýa faýlyndaky XML arasynda paýlanýar. Eger siz @AspectJ stilini ulansaňyz, onda bu maglumat bir modulda goýulýar: aspektde. Ikinjisi, XML stili @AspectJ stiline garanyňda birneme çäklendirilen, aýdyňkylyk taýdan: diňe bir gezek aspekt döretmegi goldaýar we XML-de yglan edilen atlandyrylan dilimmeleri birleşdirmek mümkin däl. Meselem, @AspectJ stiliniň kömegi bilen şeýle bir zat ýazyp bilersiňiz:
// Pointcut ulanylyşy
@Pointcut("execution(* get*())")
public void propertyAccess() {}
@Pointcut("execution(org.xyz.Account+ *(..))")
public void operationReturningAnAccount() {}
@Pointcut("propertyAccess() && operationReturningAnAccount()")
public void accountPropertyAccess() {}
// Pointcut ulanylyşy
@Pointcut("execution(* get*())")
fun propertyAccess() {}
@Pointcut("execution(org.xyz.Account+ *(..))")
fun operationReturningAnAccount() {}
@Pointcut("propertyAccess() && operationReturningAnAccount()")
fun accountPropertyAccess() {}
XML stilinde ilkinji iki dilimi yglan edip bolýar:
<aop:pointcut id="propertyAccess"
expression="execution(* get*())"/>
<aop:pointcut id="operationReturningAnAccount"
expression="execution(org.xyz.Account+ *(..))"/>
XML çemeleşmesiniň kemçiligi, bu kesgitlemeleri birleşdirip accountPropertyAccess
dilimini kesgitläp bilmezligiňizde.
@AspectJ stili goşmaça ýasama modelleri we has baý dilme düzümleri goldaýar. Möhüm ýer tapawudy aspekterapiki moduly saklamagydyr. Şeýle hem @AspectJ aspektleriniň hem Spring AOP hem-de AspectJ tarapyndan tanalyp (we ulanylýan) bolmagynyň başga bir artykmaçlygy bar. Şonuň üçin, soňrak goşmaça meseleleriň çözgütlerinde AspectJ mümkinçilikleri talap edilse, klassik AspectJ konfigurasiýasyna aňsatlyk bilen geçilip bilner. Esasan, Spring topary has giň korporatiw hyzmat konfigurasiýalaryndan çykýan aşakdaky özel aspektler üçin @AspectJ stilini saýlaýar.
Aspekt görnüşleriniň garyndy ulanmasy
Bir konfigurasiýada @AspectJ stilinde ýazylan gurallar, <aop:aspect>
bilen ulanylan proxy gurallar, <aop:advisor>
bilen yglan edilen maslahatçylar we başgaça stilde ýazylan proxylar we interseptorlar birikdirilmesi doly kabul ederliklidir. Bularyň hemmesi bir basdaş goldaýjy enjam bilen amala aşyrylýar we tutaşyp bilýär, olary birlikde ulanmaga päsgelçilik ýok.
GO TO FULL VERSION