2012-07-18 12 views
6

Sınıfları üzerinden baklalara bakmam gerekiyor. Fasulyeler bir Proxy tarafından sarıldığında (bazı yöntemler @ Transactional) - ApplicatoinContext onları bulmakta başarısız olur. Onları bir arayüz üzerinden ararsam işe yarıyor, ama bu durumda somut bir sınıf türü ile çalışıyorum. Fasulyenin aradığım türde olduğunu biliyorum, ancak getBean() yöntemi başarısız oluyor.Spring ApplicationContext.getBean (Sınıf c) proxy sınıfları için çalışmaz

Sorunu, Spring'in AbstractBeanFactory kodunda hata ayıklayabilir (ve düzeltebilirim). Sorun şu ki ben beanInstance türünü talep ediyorum türüne karşı denetler, ancak beanInstance.getClass() bir Proxy'dir. AbstractBeanFactory bunu telafi etmeli ve türü proxy'nin hedef sınıfıyla karşılaştırmalıdır.

Bunun için bir çarem var ama özellikle yamanın yamulmuş bir sürümünü kullanmak istemiyorum ve bu çalışmayı yapmak için yapılandırabileceğim bir şey olması gerektiğinden şüpheleniyorum, ya da gerçekten bir hata mı?

cevap

11

Spring, AOP'yi (örneğin, @Transactional desteği) uygulayan iki ana yol vardır: ya proxy arabirimleri veya CGLIB kullanılarak.

Arayüzler (varsayılan), sınıfınız herhangi bir arabirim uygularsa, Spring tüm bu arabirimleri uygulayan bir proxy oluşturur. Bundan sonra sadece fasonuzla bu arayüzlerden çalışabilirsiniz. Sınıfın içlerinde derinden gömüldü.

yerine aracılığıyla hedef sınıfları proxy etkinleştirirseniz:

<aop:config proxy-target-class="true"> 

Bahar yerine (obvoiusly hala tüm arayüzleri uygulayan) bir alt sınıf yaratacaktır. Bu probleminizi çözecektir. Ancak, döndürülen nesnenin gerçekten sizin sınıfınız olmadığını, ancak orijinal nesneyi saran ve temsil eden dinamik olarak oluşturulmuş alt sınıf olduğunu unutmayın. Bu çoğu durumda bir sorun olmamalı.

Ve hayır, elbette bu bir hata değil, iyi bilinen bir davranış değildir ve hayır, ilkbaharda yamaya gerek yoktur.

+0

Açıklama için teşekkürler - Fasulyeimi bir arayüz üzerinden alabildiğimi keşfettim. Bunu kullanmayı düşündüm ama sorun şu ki benim durumumda somut sınıfa kesinlikle başvurmam gerekiyor (somut sınıf ayrıca güvendiğim başka bir arayüzü de uyguluyor). Bugün etrafta çalışmak için GCLIB seçeneğini kullanacağım sonucuna geldim. Neden bunu kullanmak istemez ki? Vekil sınıfları kullanmak için, bu bir 'özellik' değil, bana bir böcek gibi kokuyor! –

+0

@AlexWorden: Sınıfınız birkaç arayüz uygularsa, bunlardan herhangi birini getirebilirsiniz. CGLIB'nin dezavantajlarından biri de CGLIB (harici kütüphane) kullanmanız. Eh, ne bir hata ne de bir özellik - Bahar, AOP'yi bir şekilde uygulamak zorundadır ve bunlar en yaygın iki özelliktir. Ayrıca CGLIB, bir tane yerine sınıfınızın iki örneğini oluşturmak gibi başka yan etkilere de sahiptir. Bir yorum için iki şey –

1
<context:component-scan base-package="<Your base package name goes here>" /> 
<aop:aspectj-autoproxy /> 
<aop:config proxy-target-class="true"/> 

applicationContext.xml bu bu üç satırları yazarken Ayrıca bkz benim için çalıştı.

İlgili konular