2017-03-01 2 views
1

ich einen Prototyp BeanFactory haben (CreateCarAction ist Frühling Bohne, scope = Prototyp):autowiring abstrakte Komponente

@Component("createCarActionFactory") 
public abstract class CreateCarActionFactory { 

    @Lookup 
    public abstract CreateCarAction createCarAction(); 
} 

und ich es so Autowire:

@Autowired 
@Qualifier("createCarActionFactory") 
private CreateCarActionFactory createCarActionFactory; 

Es funktioniert, wenn ich abstrakt entfernen von CreateCarActionFactory. Wenn ich abstract entferne, muss ich createCarAction() implementieren - ich brauche diese Implementierung nicht, da @Lookup sie überschreibt. Als ich von CreateCarActionFactory zurücktreten muss ich CreateCarAction Form BeanFactory zugreifen, so dass ich Jave zu Autowire BeanFactory, die auch hässlich ..

Kann ich autowire abstrakt CreateCarActionFactory@Component?

+0

Warum verwenden Sie nicht den Provider? '' 'Provider createCarActionProvider;' '' und dann einfach '' 'createCarActionProvider.get()' ''. – hya

+2

Sie können abstrakte Klasse nicht autowire - http://StackOverflow.com/a/15971422/1814524 – hya

+0

hya - ich verstehe nicht, wo wäre die Implementierung eines solchen Providers? Wie würde es neue Klasse mit autoverwirkten 2 Frühlingsbohnen schaffen? Dies ist der Grund, warum ich Lookup verwende. – michealAtmi

Antwort

0

Sie können autowire eine Schnittstelle, so ändern Sie CreateCarActionFactory von abstrakten Klasse in eine Schnittstelle.

+0

NoSuchBeanDefinitionException: Kein qualifizierendes Bean vom Typ [mypackage.CreateCarActionFactory] gefunden für Abhängigkeit: erwartet mindestens 1 Bean, das sich als Autowire-Kandidat für diese Abhängigkeit qualifiziert. Abhängigkeitsanmerkungen: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} – michealAtmi