2015-10-15 5 views
7

Java 8 hinzugefügt eine neue Funktion, mit der wir Methodenimplementierung in Schnittstellen bereitstellen können. Gibt es einen Weg in Frühling 4, durch den wir Bohnen in die Schnittstelle injizieren können, die innerhalb des Methodenkörpers verwendet werden kann? Unten ist der BeispielcodeJava 8 und Spring 4: Verwenden Sie Autowirhining in Schnittstelle

public interface TestWiring{ 

@Autowired 
public Service service;// this is not possible as it would be static. 
//Is there any way I can inject any service bean which can be used inside testWiringMethod. 
default void testWiringMethod(){ 
    // Call method of service 
    service.testService(); 
} 
} 
+3

Sie können eine Schnittstelle nicht instanziieren. Wie würdest du ein Feld darin autowire? – Tunaki

+0

Ich möchte federverwaltete Dienste in meinem Methodenkörper verwenden. Eine Möglichkeit ist die Verwendung von ApplicationContext.getbean (") Methode. Aber ich bin auf der Suche nach jeder Funktion in Spring 4, die ich für die Injektion von Spring verwalteten Beans in Schnittstelle verwenden kann. Schnittstelle würde durch einige Bean implementiert werden. So sollte es in verfügbar sein." Die Implementierungsklasse Standardmäßig sind die Mitglieder der Schnittstelle statisch, daher kann ich @autowiring nicht direkt verwenden –

+0

DI in Spring funktioniert entweder durch Festlegen der Abhängigkeiten im Konstruktor (Konstruktorinjektion) oder über die Eigenschaft (Setterinjektion) Interface, Sie haben weder einen Konstruktor, noch Instanzvariablen (die Variablen, die Sie in einer Schnittstelle deklarieren, sind 'static final'), also gibt es keine Möglichkeit, etwas zu injizieren. – Ruben

Antwort

7

Das ist ein bisschen schwierig, aber es funktioniert, wenn Sie die Abhängigkeit innerhalb der Schnittstelle für jede Art Anforderung benötigen.

Die Idee wäre, eine Methode zu deklarieren, die die implementierte Klasse dazu zwingt, die Abhängigkeit bereitzustellen, die Sie automatisch ansteuern möchten.

Die schlechte Seite dieses Ansatzes ist, dass wenn Sie zu viele Abhängigkeiten bereitstellen möchten, der Code nicht hübsch sein wird, da Sie einen Getter für jede Abhängigkeit benötigen.

public interface TestWiring { 

    public Service getService(); 

    default void testWiringMethod(){ 
     getService().testService(); 
    } 

} 


public class TestClass implements TestWiring { 

    @Autowire private Service service; 

    @Override 
    public Service getService() { 
     return service; 
    } 

}