2015-10-15 11 views
7

Java 8 ha aggiunto una nuova funzionalità grazie alla quale è possibile fornire l'implementazione del metodo nelle interfacce. C'è un modo in Spring 4 con cui possiamo iniettare i fagioli nell'interfaccia che può essere usata all'interno del corpo del metodo? Di seguito è riportato il codice di esempioJava 8 e Spring 4: utilizzo dell'autowiring nell'interfaccia

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

Non è possibile creare un'istanza di un'interfaccia. Come ti autowire un campo in esso? – Tunaki

+0

Desidero utilizzare i servizi gestiti a molla nel mio corpo del metodo. Un modo è utilizzare il metodo ApplicationContext.getbean ("), ma sto cercando qualsiasi funzione in Spring 4 che possa sfruttare per l'iniezione di bean gestiti in Spring nell'interfaccia. L'interfaccia sarebbe implementata da alcuni bean. Quindi dovrebbe essere disponibile in la classe di implementazione Per impostazione predefinita poiché i membri dell'interfaccia sono statici finali, quindi non posso utilizzare direttamente @autowiring. –

+0

DI in Spring funziona impostando le dipendenze nel costruttore (iniezione costruttore) o tramite proprietà (setter injection). interfaccia, non hai un costruttore, né variabili di istanza (le variabili dichiarate in un'interfaccia sono 'static final'), quindi non c'è modo di iniettare nulla. – Ruben

risposta

7

Questo è un po 'complicato ma funziona se è necessario la dipendenza all'interno dell'interfaccia per qualsiasi esigenza.

L'idea sarebbe dichiarare un metodo che costringerà la classe implementata a fornire quella dipendenza che si desidera autorizzare.

Il lato negativo di questo approccio è che se si desidera fornire troppe dipendenze il codice non sarà bello poiché sarà necessario un getter per ogni dipendenza.

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; 
    } 

}