2011-11-01 28 views
5

Spring AOP ile çalıyorum. İşte Spring AOP, fazladan fasulye yaratıyor

public class CModel extends Car { 
    private double torqueMeasure = 1; 

    public CModel() { 
     System.out.println(" C-Model constructor");   
    } 
} 

Ve Bahar yapılandırma şimdi bu

<aop:config> 
    <aop:aspect ref="audit"> 
     <aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/> 
      ... 
    </aop:aspect> 
</aop:config> 

Ok gibi basit bir sınıftır; aop: config eklediğimde ve CModel'i kesiştirdikten sonra Spring, CModel yapıcısını iki kez çağırır. Bahar, 2 CModel nesnesi yaratıyor demektir, değil mi?

AOP yapılandırmasını silersem, Yay yalnızca bir CModel nesnesi oluşturur.

Bunun neden böyle olduğu hakkında bir fikrin var mı?

Teşekkürler.

+1

Sanırım bahar bu fasülyeyi ve vekilini yaratıyor. Dinamik proxy sınıfı, temel sınıfı genişletir, bu yüzden yapıcısında super() öğesini çağırmalıdır. Yeni özel durum(). PrintStackTrace() gibi bir şey olduğundan emin olmak için CModel yapıcısında yığın izi yazdırabilirsiniz. – svaor

cevap

5

Emin değilim, tahminim bahar ilk önce normal sınıfı başlatıyor ve ardından bir alt sınıf olan bir CGLIB proxy'si yapıyor. Başlatma için @PostConstruct kullanmalısınız, ki bu bir kez kullanılacak garantidir.

, hipotezimi doğrulamak yapıcı bir kesme noktası ekleyebilir ve çağrıldığında görmek için -

+1

Sanırım haklısınız. Aslında bu konu hakkında blog yazdım (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html), belki OP burada daha fazla ayrıntı bulabilir. BTW bunu doğrulamak için daha da basit bir yöntem vardır: 'System.out.println (this)' - ikinci basılmış çizgi 'CModel $ EnhancedByCGLIB' gibi bir şey verecektir. –

+3

[7.6 Proxy mekanizmaları] 'nda belgelenmiştir (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying) – axtavt

3
Bahar Sınıfınızda bir proxy oluşturur

, bu kullanacağı zamanlardan biri de CModel$EnhancedByCGLIB şey hemen sonrasında olmalıdır CGLIB, alt sınıflardan oluşan bir sınıf oluşturmak için CModel. Net etkisi yapıcınız iki kez çağrılacak. Daha fazla ayrıntı için Bahar belgelerinde (özellikle üçüncü mermi) üzerinden

Kontrol: - ve JDK proxy mekanizmasını sınıf bir arabirim uygulaması halinde bir yan not olarak http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying

, Bahar JDK proxy mekanizmasını kullanır kurucunuzu aramayacak.

+1

Darn - gibi görünüyor Yumruğa dayak yemiştim :) Yinelenen cevap için üzgünüm. – wmkoch

İlgili konular