Bahar AOP vs AspectJ


178

Spring AOP'un en iyi, çerçeve olarak özel Java5 ek açıklamalarını kullandığı için güvenlik, günlük kaydı, işlemler vb. Gibi uygulamaya özgü görevler için en iyi şekilde kullanıldığı izlenimindeyim. Bununla birlikte, AspectJ daha akıllı tasarım desenleri gibi görünüyor.

Herkes bir Bahar uygulamasında Spring AOP vs AspectJ kullanarak çeşitli artılarını ve eksilerini vurgulayabilir misiniz?


3
İlkbaharda bazı ek açıklamalar var, ancak Java'da da var olduğunda ne kullanmalısınız? Java. Aynı mantık bu işlevsellik için de geçerlidir. Bahar Bahar'dır. bugün burada yarın gitti. (İnsanların İlkbahardan bir süre önce Struts kullandığını hatırlayın). AspectJ, tercih edilen uzun vadeli çözümdür. İlkbahardan daha uzun sürecek. Ben sadece bu açıdan Bahar'ı reddetmiyorum ...: -;
inor

Yanıtlar:


236

Spring-AOP Artıları

  • LTW ( yükleme zamanı dokuma ) veya AspectJ derleyicisini kullanmak zorunda olmadığınız için AspectJ'den daha kolaydır .

  • Proxy desenini ve Dekoratör desenini kullanır

Spring-AOP Eksileri

  • Bu proxy tabanlı AOP'tur, bu nedenle temel olarak yalnızca yöntem yürütme birleşim noktalarını kullanabilirsiniz.
  • Aynı sınıfta başka bir yöntem çağrılırken yönler uygulanmaz.
  • Küçük bir çalışma zamanı yükü olabilir.
  • Spring-AOP, Spring fabrikası tarafından oluşturulmayan hiçbir şeye özellik ekleyemez

AspectJ Artıları

  • Bu tüm birleşim noktalarını destekler. Bu her şeyi yapabileceğiniz anlamına gelir.
  • Bahar AOP'ninkinden daha az çalışma zamanı yükü vardır.

AspectJ Eksileri

  • Dikkatli ol. Özelliklerinizin sadece dokunmak istediğiniz şeye dokunup dokunmadığını kontrol edin.
  • AspectJ Derleyici ile ekstra derleme sürecine ihtiyacınız var veya LTW (yükleme zamanı dokuma)

20
@Configurable, AspecJ'in Spring üzerinden kullanılmasını gerektirir. Dokümanlar:If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
HDave

7
benim için başka bir bahar-aop con proxy tabanlı yaklaşım nedeniyle okunamaz uzun yığın izler
wrm

1
Cevapta kafa karıştırıcı bir kısım: küçük bir çalışma zamanının bir araç için profesyonel yanlısı olması ve diğer çalışma zamanı için küçük bir çalışma zamanının ek yükü olması ihtimali nedir?
Moreaki

16
@Moreaki: Dezavantaj olarak 'biraz havai' ve profesyonel olarak 'biraz havai' dedi. Tek 'a' farkı çok önemlidir - İngilizce'de, 'küçük' 'bazıları' anlamına gelirken, 'küçük' 'neredeyse hiçbiri' anlamına gelmez.
wujek

1
Sadece hızlı bir şüphe - Bahar AOP Uzmanlarınızda (2. puan) - İlkbaharda @Aspect ek açıklamasını kullanırsak, bu, Proxy (Çalışma süresi) veya bayt modifikasyonu (derleme ( zaman). Çünkü AspectJ'in derleme zamanı ve Spring AOP'un çalışma zamanı AOP olduğu izlenimindeyim. Pls yardım
Pedantik

21

Başkalarının söylediklerinden başka - sadece yeniden ifade etmek için there are two major differences:

  1. Biri dokuma türü ile ilgilidir.
  2. Birleşme noktası tanımına bir başka.

Spring-AOP: Şu kavram kullanılarak proxy aracılığıyla çalışma zamanı dokumadynamic proxy if interface exists or cglib library if direct implementation provided.

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

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




14

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

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

İlkbaharda AOP'un nasıl çalıştığını anlamanın kilit noktası, Bahar ile bir Unsur yazdığınızda, çerçevenizi nesneleriniz için bir proxy oluşturarak JDKDynamicProxydüzenleriz, eğer fasulyeniz bir arayüz uygularsa veya fasulyeniz herhangi bir uygulama yapmazsa CGLIB aracılığıyla 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. Bahar 3.2'den itibaren işe yaramaz çünkü cglib 2.2 çekirdeğe dahil edildi.

Fasulye oluşturmadaki çerçeve, nesnelerinizi saran ve güvenlik, işlem yönetimi, günlüğe kaydetme ve benzeri gibi kesişen endişeler ekleyen bir proxy oluşturacaktır.

Bu şekilde proxy oluşturma, hangi fasulye ve yöntemlerin proxy olarak oluşturulacağına karar verecek çerçeveyi belirleyen bir nokta ifade için başlayarak uygulanacaktır. Tavsiye, kodunuzdan daha fazla sorumluluk olacaktır. Bu süreçte nokta kesimin yalnızca nihai olarak bildirilmeyen genel yöntemleri yakaladığını unutmayın.

Şimdi, Bahar AOP'de Aspects'in dokuma konteyneri başlangıçta konteyner tarafından gerçekleştirilecekken, AspectJ'de bunu kodunuzu bayt kodu modifikasyonu yoluyla bir derleme ile gerçekleştirmelisiniz. Bu nedenle bence Bahar yaklaşımı AspectJ'den daha basit ve yönetilebilir.

Öte yandan, Bahar AOP ile AOP'nin tüm gücünü kullanamazsınız çünkü uygulama kodlarınızda değişiklik yapılarak değil, proxy üzerinden yapılır.

AspectJ'de olduğu gibi, SpringAOP'ta yükleme zamanı dokuma kullanabilirsiniz. İlkbaharda bir ajan ve özel konfigürasyonlarla @EnabledLoadWeavingveya XML ile uygulandığında bu özellikten yararlanabilirsiniz . Ad alanını örnek olarak kullanabilirsiniz. Ancak Bahar AOP'de tüm vakalara müdahale edemezsiniz. Örneğin, newkomut Bahar AOP'de desteklenmez.

Ancak Spring AOP'de aspectof, yay konfigürasyonu çekirdeğindeki fabrika yöntemini kullanarak AspectJ kullanımından faydalanabilirsiniz .

Spring AOP'un temel olarak kaptan oluşturulan bir proxy olması nedeniyle, AOP'yi sadece bahar fasulyesi için kullanabilirsiniz. AspectJ ile bu özelliği tüm fasulyelerinizde kullanabilirsiniz. Diğer bir karşılaştırma noktası, hata ayıklama ve kod davranışının öngörülebilirliğidir. Bahar AOP ile, iş tüm Java derleyiciden önceden oluşturulur ve yönleri Bahar fasulyeniz için proxy oluşturmak için çok güzel bir yoldur. AspectJ'de kodu değiştirirseniz, daha fazla derlemeye ihtiyacınız vardır ve özelliklerinizin nerede dokunduğunu anlamak zor olabilir. İlkbaharda dokumayı kapatmak daha basittir: İlkbaharda, yönü yapılandırmanızdan kaldırır, yeniden başlatır ve çalışır. AspectJ'de kodu yeniden derlemelisiniz!

Yükleme süresi dokumasında AspectJ, Spring'den daha esnektir çünkü Spring, AspectJ'nin tüm seçeneklerini desteklemez. Ama bence bir fasülyenin yaratılma sürecini değiştirmek istiyorsanız, daha iyi bir yol, yeni operatörünüzün davranışını değiştiren bir yönün yükleme zamanı dokuma ile değil, bir fabrikadaki özel girişin yönetilmesidir.

Umarım AspectJ ve Spring AOP'un bu panoramik görüntüsü iki iksirin farkını anlamanıza yardımcı olur


0

Unsurlarınızın görev açısından kritik olup olmayacağını ve kodunuzun nereye yerleştirildiğini düşünmek önemlidir. İlkbahar AOP, yükleme zamanı dokumaya güvendiğiniz anlamına gelir. Bu örgü başarısız olabilir ve benim tecrübelerime göre günlüğe kaydedilmiş hatalar var olabilir ama uygulama en boy kodu olmadan çalışmasını engellemeyecektir [Ben bu şekilde olmayacak şekilde yapılandırmak mümkün olabilir uyarıyı eklerim durum; ama ben şahsen farkında değilim ]. Derleme zamanı dokuma bunu önler.

Ayrıca, AspectJ'i aspectj-maven-eklentisi ile birlikte kullanıyorsanız, bir CI ortamındaki özelliklerinize karşı birim testleri gerçekleştirebilir ve yerleşik yapıların test edildiğinden ve doğru şekilde dokunduğundan emin olabilirsiniz. Kesinlikle Yay tahrikli ünite testleri yazabilmenize rağmen, konuşlandırılan kodun LTW başarısız olması durumunda test edilen kod olacağına dair hala bir garantiniz yoktur.

Başka bir husus, uygulamayı bir sunucu / uygulama başlatmanın başarısını veya başarısızlığını doğrudan izleyebileceğiniz bir ortamda mı barındırdığınızın veya uygulamanızın gözetiminizin altında olmadığı bir ortamda mı dağıtıldığıdır [ör. bir müşteri tarafından barındırılıyor]. Yine, bu zaman dokumasını derlemenin yolunu gösterecektir.

Beş yıl önce, çalışmanın daha kolay olması ve IDE'mi çiğnemenin daha az olası olması nedeniyle Spring yapılandırılmış AOP lehine çok daha iyiydim. Ancak, bilgi işlem gücü ve kullanılabilir bellek arttıkça bu çok daha az sorun haline geldi ve aspectj-maven-eklentisi ile CTW, yukarıda özetlediğim nedenlere dayanarak çalışma ortamımda daha iyi bir seçim haline geldi.


0

Bu makalenin konuyla ilgili de iyi bir açıklaması var.

Bahar AOP ve AspectJ'nin farklı hedefleri vardır.

Spring AOP, programcıların karşılaştığı en yaygın sorunları çözmek için Spring IoC'de basit bir AOP uygulaması sağlamayı amaçlamaktadır.

Öte yandan AspectJ, eksiksiz bir AOP çözümü sağlamayı amaçlayan orijinal AOP teknolojisidir.


0

AOP ile karşılaştırıldığında AspectJ'nin hedef sınıfı derleme zamanında geliştirmesine gerek yoktur. Bunun yerine, hedef sınıf için çalışma zamanında hedef sınıfla aynı arabirimi uygulayan veya hedef sınıfın bir alt sınıfı olan bir proxy sınıfı oluşturur.

Özetle, proxy sınıfının bir örneği, hedef sınıfın bir örneği olarak kullanılabilir. Genel olarak, derleme zamanı geliştirilmiş AOP çerçevesi performansta daha avantajlıdır - çünkü çalışma zamanı ile geliştirilmiş AOP çerçevesi her çalıştığında dinamik geliştirmeler gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.