it-swarm.dev

Spring AOP vs AspectJ

Spring AOP'un, özel Java5 ek açıklamalarını bir çerçeve olarak kullandığından, güvenlik, kayıt, işlemler vb. Uygulamaya özgü görevler için en iyi şekilde kullanıldığı izlenimini edindim. Bununla birlikte, AspectJ akıllıca daha kolay tasarım desenleri gibi görünüyor. 

Bir Spring uygulamasında Spring AOP vs AspectJ kullanmanın çeşitli avantajlarını ve dezavantajlarını kimse vurgulayabilir mi?

156
zotherstupidguy

İlkbahar-AOP Artıları

  • LTJ ( yükleme süresi dokuma ) veya AspectJ derleyicisini kullanmanız gerekmediğinden, AspectJ'den daha basittir.

  • Proxy modelini ve Dekoratör Modelini kullanır.

Bahar-AOP Eksileri

  • Bu, proxy tabanlı AOP'dir, bu nedenle temelde yalnızca yöntem yürütme birleştirme noktalarını kullanabilirsiniz.
  • Aynı sınıf içinde başka bir yöntem çağrılırken görünümler uygulanmaz.
  • Yükü biraz çalışma zamanı olabilir.
  • Spring-AOP, Spring fabrikası tarafından yaratılmayan hiçbir şeye bir görünüm ekleyemez.

AspectJ Artıları

  • Bu, tüm birleşme noktalarını destekler. Bu her şeyi yapabileceğiniz anlamına gelir. 
  • Genelde, Spring AOP'a göre daha az çalışma zamanı var.

AspectJ Eksileri

  • Dikkatli ol. Yönlerinizin yalnızca dokunmak istediğiniz şeye dokunduğunu kontrol edin.
  • AspectJ Compiler ile fazladan bir inşa işlemine ihtiyacınız var veya LTW'yi kurmanız gerekir (yükleme süresi dokuma)
208
Whiteship

Başkalarının söylediklerinin yanı sıra - sadece yeniden yazmak için, there are two major differences:

  1. Bunlardan biri dokuma türü ile ilgilidir. 
  2. Birleşme noktası tanımına bir diğeri.

Spring-AOP: Prodüksiyonda dynamic proxy if interface exists or cglib library if direct implementation provided. konseptini kullanarak dokuma

AspectJ: Kaynak varsa veya derleme dokuma sonrası (derlenmiş dosyalar kullanarak) AspectJ Java Tools(ajc compiler) ile dokuma zamanı derleyin. Ayrıca, Spring ile dokuma süresi yüklenebilir - aspectj tanım dosyasına ihtiyaç duyar ve esneklik sunar.

Derleme zamanı dokuma, performansın (bazı durumlarda) ve ayrıca joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.'un yararlarını sunabilir

21
techzen

Ek bir not: Yüksek yük altındaki performans önemliyse, Spring AOP öğesinden 9-35x daha hızlı olan AspectJ'i istersiniz. 10ns vs 355ns, kulağa pek benzemiyor olabilir ama LOTS of Aspect’i kullanan insanlar gördüm. 10 bin en değerli şey. Bu gibi durumlarda, isteğiniz binlerce yöne çarpabilir. Bu durumda, bu talebe ms ekliyorsunuzdur.

Bkz. benchmarkları .

18
Joseph Lust

Yaylı kullanım kılavuzu , doğrudan atın ağzından çok fazla bilgi verecektir. 

Bölüm 6.4 - Hangi AOP bildirim tarzının kullanılacağının seçilmesi her ikisinin de artılarını ve eksilerini tartıştığı için sizin için ölü.

6.1.2 - Bahar AOP Yetenekleri ve amaçları & bölümler 6.2 - @Aspect desteği ve 6.8 - AspectJ'in Spring uygulamalarında kullanılması özellikle ilginç olmalıdır.

16
elhoim

Bahar AOP, bahar çerçevesinin önemli parçalarından biridir. Çok temel aşamada, bahar çerçevesi IoC ve AOP'ye dayanmaktadır. İlkbaharın resmi dersinde yazdığı bir slayt var:

AOP, çerçevenin en önemli kısımlarından biridir.

İlkbaharda AOP'nin nasıl çalıştığını anlamak için kilit nokta, Spring ile bir Aspect yazdığınızda, çekirdeğiniz bir arayüz uygularsa, çekirdeğiniz bir arayüz uygularsa JDKDynamicProxy ile nesneleriniz için bir vekil inşa etmemizdir herhangi bir arayüz. 3.2 sürümünden önce Spring kullanıyorsanız, sınıf yolunuzda cglib 2.2 olması gerektiğini unutmayın. İlkbahar 3.2'den başlayarak işe yaramaz çünkü çekirdeğe cglib 2.2 dahil edildi.

Fasulyenin yaratılmasındaki çerçeve, nesnelerinizi saran ve güvenlik, işlem yönetimi, kayıt tutma vb.

Bu şekilde proxy oluşturma, hangi fasulye ve yöntemlerin proxy olarak oluşturulacağına karar verecek çerçeveyi belirleyen bir açık ifadeden başlayarak uygulanacaktır. Tavsiye, kodunuzdan daha fazla sorumluluk olacaktır. Unutmayınız ki bu süreçte, yalnızca son olarak ilan edilmeyen ortak metotlar elde edilmiştir.

Şimdi, Spring AOP'ta Aspect'in dokuması konteyner başlangıcında konteyner tarafından gerçekleştirilirken, AspectJ'de bunu kodunuzun bytecode modifikasyonuyla derlenmesinden sonra yapmanız gerekir. Bu nedenle bence Bahar yaklaşımı AspectJ'den daha basit ve yönetilebilir.

Diğer taraftan, Spring AOP ile AOP'nin tüm gücünü kullanamazsınız, çünkü uygulama kodunuzda yapılan değişikliklerle değil, proxy sunucular aracılığıyla yapılır.

AspectJ'de olduğu gibi, SpringAOP'ta yükleme süresi dokuma kullanabilirsiniz. Bu özellikten ilkbaharda yararlanabilirsiniz bir ajanla ve özel yapılandırmalarla, @EnabledLoadWeaving veya XML ile uygulanır. Ad alanını örnek olarak kullanabilirsiniz. Ancak, Bahar AOP'ta tüm vakaları yakalayamazsınız. Örneğin, new komutu, Spring AOP'ta desteklenmez.

Bununla birlikte, Spring AOP’da, AspectJ’in yay konfigürasyonundaki aspectof fabrika yöntemini kullanarak faydalanabilirsiniz.

Spring AOP'nin temelde kaptan oluşturulan bir proxy olması nedeniyle, bu nedenle AOP'yi sadece bahar fasulyesi için kullanabilirsiniz. AspectJ ile beraber tüm fasulyelerde de kullanabilirsiniz. Diğer bir karşılaştırma noktası hata ayıklama ve kod davranışının tahmin edilebilirliğidir. İlkbahar AOP'ında iş, Java derleyicisinden önceden oluşturulmuştur ve görünümler, ilkbahar çekirdeğiniz için proxy oluşturmak için çok iyi bir yoldur. AspectJ'de, kodu değiştirirseniz, daha fazla derlemeye ve yönlerinizin nerede dokuma olduğunu anlamak zor olabilir. İlkbaharda dokumayı kapatmak bile daha basittir: yay ile özelliği yapılandırmanızdan kaldırırsınız, yeniden başlatır ve çalışır. AspectJ'de kodu tekrar derlemelisiniz!

Yüklü dokumada, AspectJ, Spring'e göre daha esnektir çünkü Spring, AspectJ'in tüm seçeneklerini desteklemez. Ancak bence bir fasulyenin yaratma sürecini değiştirmek istiyorsanız, bir fabrikada özel oturum açmayı yönetmek ve yeni operatörünüzün davranışını değiştiren bir yönü yükleme süresi ile değil daha iyi bir yoldur.

Umarım bu AspectJ ve Spring AOP panoramikinin iki iksirin farkını anlamanıza yardımcı olur.

9
Valerio Vaudi

Yönlerinizin kritik görev olup olmayacağını ve kodunuzun nerede dağıtıldığını dikkate almak önemlidir. Spring AOP, yükleme süresine dayanan dokumaya güvendiğiniz anlamına gelir. Bu dokuma başarısız olabilir ve deneyimlerime göre, kaydedilmiş hataların var olabileceği, ancak uygulamanın görünüm kodu olmadan çalışmasını engellemeyeceği anlamına gelir [Ben bunu bu şekilde yapılandırmanın mümkün olacağı uyarısını eklerdim. durum böyle değil; ama ben şahsen bunun farkında değilim]. Derleme zamanı dokuma bu önler. 

Ek olarak, AspectJ'yi Aspectj-Maven-Plugin ile birlikte kullanırsanız, bir CI ortamında yönlerinize karşı birim testleri yapabilir ve yapılı eserlerin test edildiğinden ve doğru bir şekilde dokunulduğundan emin olabilirsiniz. Spring'e dayalı ünite testlerini kesinlikle yazabilseniz de, dağıtılan kodun LTW'nin başarısız olması durumunda test edilen kod olacağını garanti edemezsiniz.

Diğer bir husus, uygulamayı bir sunucu/uygulama başlangıcının başarısını veya başarısızlığını doğrudan izleyebileceğiniz bir ortamda mı yoksa uygulamanızın sizin denetiminiz altında olmayan bir ortamda mı dağıtıldığını mı düşünüyorsunuz [ör. bir müşteri tarafından barındırıldığı yer]. Yine, bu zaman dokumasını derlemenin yolunu gösterir.

Beş yıl önce, daha kolay çalışabilmesinin ve IDE'mi çiğnemenin daha az muhtemel olmasından dolayı Spring'in AOP'yi yapılandırmasından yanaydım. Ancak, bilgisayar gücü ve kullanılabilir bellek arttıkça, bu sorun daha az hale geldi ve CTW.

0
kcampbell

Bu makale ayrıca konuyla ilgili iyi bir açıklama yapmıştır.

Bahar AOP ve AspectJ'in farklı hedefleri var.

Bahar AOP, Bahar .__ boyunca basit bir AOP uygulaması sağlamayı amaçlamaktadır. Programcıların karşılaştığı en yaygın sorunları çözmek için IoC.

Öte yandan, AspectJ, amaçlayan orijinal AOP teknolojisidir. tam AOP çözümü sağlamak.

0
gce