2015-03-08 16 views
7

Bir hizmet sınıfının Otomatikleştirilmiş somut uygulamasına göre enjekte etmem gerekiyor.Yay - Beton arabirim uygulaması nasıl yapılır?

Servis arayüzü:

public interface PostService { 
... 
} 

Uygulama:

hizmetinde Yöntemleri @ İşlem ek açıklama ile olan
@Service("postServiceImpl") 
public class PostServiceImpl implements PostService { 
... 
} 

Ve şimdi benim denetleyicisine postServiceImpl enjekte etmek istiyoruz - ben gerektiğinden Uygulamada bir yöntem kullanmak için, bu arayüzde değil:

@Autowired 
@Qualifier("postServiceImpl") 
private PostServiceImpl postService; 

Ben aşağıdaki iletiyle NoSuchBeanDefinitionException olsun:

bağımlılık bulundu tipi [.PostServiceImpl (...)] Hayır eleme fasulye: beklenen autowire olarak nitelendirir en az 1 fasulye Bu bağımlılık için aday.

Ben benim denetleyicisi alanına değiştirdiğinizde:

private PostService postService 

çalıştığını, ancak PostServiceImpl belirli bir yöntem kullanamazsınız.

+3

Ardından arabirime ekleyin. Beton tipini enjekte ederseniz arayüzler ilan etme noktası nedir? –

+0

Bu fasülyeye uygulanan bazı yönleriniz var mı? Veya proxy'ler arayüz tabanlı? – fcracker79

+1

@ fcracker79 Sanırım sahip olduğum, çünkü hizmetteki yöntemler @ İşlem ek açıklamaları ile. – tomdavies

cevap

9

Yöntemleriniz @Transactional açıklamalı olduğundan, yayın, işlem yönetimi kodunu enjekte etmek için çalışma zamanında proxy oluşturur. Spring, varsayılan olarak, arabirimlere dayalı proxy'leri temsil eden proxy mekanizması için JDK Dynamic Proxy'u kullanır.

Bu durumda, yay, PostService arabirimini uygulayan bir başka sınıf oluşturur ve bu sınıfın çekirdeğini oluşturur. Kesinlikle bu kardeşler gibi, PostServiceImpl için otomatik olarak bağlanamaz. Bununla birlikte, eğer sınıfta otomatik bağlantı yapmak istiyorsanız, alt sınıfı kullanarak proxy'leri yerine, CGLib proxy'yi kullanmak için yayı zorlayabilirsiniz. Java tabanlı yapılandırma kullanıyorsanız, ek açıklamanızda proxyTargetClass=true ayarını yapabilirsiniz.

İlgili konular