2017-01-06 5 views
0

Wir müssen unsere Code-Basis mit einem Partner für die Entwicklung teilen, aber wir wollen die Implementierung einiger Dienste nicht offenbaren.Können wir im Frühjahr eine Schnittstelle ohne jegliche Implementierung autowire?

Angenommen, wir haben eine Schnittstelle FooService und ihre Implementierung FooServiceImpl.

Viele andere Klassen autowire diesen Dienst in und rufen doSomething(). Zum Beispiel:

@Service 
public class BarServiceImpl implements BarService 
{ 
    @Autowired 
    private FooService fooService; 

    @Override 
    public String validate(); 
    { 
     fooService.doSomething(); 
     ... 
    } 
} 

Wenn ich löschen Sie einfach FooServiceImpl, natürlich ein NoSuchBeanException wird beim Start geworfen werden. Wenn ich @Autowired(required = false) überall dort verwende, wo FooService autowired ist, wird ein NullPointerException zur Laufzeit immer dann ausgelöst, wenn doSomething() aufgerufen wird.

Abgesehen von der Entfernung jeder Methode Körper in FooServiceImpl manuell, gibt es eine andere Möglichkeit, um dies zu arbeiten?

Jede Hilfe wird geschätzt.

+0

warum möchten Sie das tun? Sie brauchen einen 'FooService' für' BarServiceImpl' um zu funktionieren, oder? –

+3

Sie müssen ihnen die Implementierung * irgendwann * bringen. Im besten Fall könnten Sie eine Stub-Implementierung schreiben. Werfen Sie einen Blick auf die Datenquellenbehandlung von Spring Boot, um zu sehen, wie sie eine In-Memory-Fallback-Datenbank bereitstellen, wenn Sie keine echte Datenbank konfigurieren. – chrylis

Antwort

-1

Können wir eine Schnittstelle ohne Implementierung im Frühjahr autwire?

Nr

Sie versuchen zu Instanz erstellen für eine Schnittstelle, die in Java nicht möglich ist.

+0

Warum runter? Sie können einen Kommentar hinterlassen –

0

Zunächst einmal, wie @AdrianShum und @chrylis kommentiert, benötigen Sie eine Implementierung von FooService für BarServiceImpl.validate() zu arbeiten. So ist es nicht klar, was Sie mit "wollen nicht die Implementierung von einigen Diensten offenbaren".

  • NoSuchBeanException - Wie Sie autowiring FooService in BarServiceImpl, wird der Scanvorgang eine Bohne von FooService Art zu finden, durchgeführt werden. Da Sie keine Implementierung von FooService haben, tritt dieser Fehler auf.
  • NullPointerException - Wie required=false wird das obige Problem während der Initialisierung vernachlässigt. Aber die private FooService fooService wird offensichtlich einen NULL Wert haben. Eine Ausnahme tritt auf, wenn Sie fooService.doSomething() aufrufen.
  • Jetzt können Sie denken, möglicherweise können Sie setzen @Component (oder ähnliche Sache) auf Ihrem interface. In der Spring-Dokumentation "Diese Annotation ist für die Implementierungsklassen, die automatisch durch den Klassenpfad Scannen" erkannt werden. Dann wird es NoSuchBeanException geben, da Sie keine Implementierungsklassen haben.

So können Sie eine Schnittstelle im Frühjahr ohne jede Implementierung nicht automatisch senden.

1

stimme ich chrylis zu; Ihr Anwendungsfall klingt wie eine Standardimplementierung.Ich würde auch Ihren Code so konfigurieren, dass die Benutzer Ihrer Bibliothek ihre eigene Implementierung bereitstellen können. Spring lässt Sie dies leicht mit ihren @Conditional... Annotationen tun. Insbesondere sollten Sie @ConditionalOnMissingBean verwenden.

Standardimplementierung

@Component 
public class DefaultFooServiceImpl implements FooService { 
    @Override 
    public void doSomething() { 
    LOG.info("Using default implementation of doSomething(); nothing will happen"); 
    } 
} 

Beispielkonfiguration

@Configuration 
public class ServiceConfig { 
    @ConditionalOnMissingBean(FooService.class) 
    @Bean 
    DefaultFooServiceImpl defaultFooServiceImpl() { 
    return new DefaultFooServiceImpl(); 
    } 
} 

Wenn Ihr Partner Ihre Bibliothek verwendet, erhalten sie die Implementierung Standard sowie die Möglichkeit, eine bessere Umsetzung zu sorgen. Wenn Sie Ihre Bibliothek verwenden, können Sie eine ProprietaryFooServiceImpl Bean erstellen, die stattdessen injiziert wird.

Verwandte Themen