2 Stimmen

Problem bei der automatischen Einbindung eines @Service in eine Bibliothek eines Drittanbieters

Im Moment bin ich Autowiring myService in verschiedene Objekte in meiner Anwendung und es funktioniert gut.

@Autowired
private MyService myService;

mit dieser Konfiguration:

<context:component-scan base-package="com.myapp.mypackage" />

Ich habe jedoch eine Bibliothek eines Drittanbieters hinzugefügt und möchte Autowire myService auch in einige Objekte in diesem Paket, aber es funktioniert nicht.

Ich habe diese Änderung an meinem Komponentenscan vorgenommen, aber ich erhalte eine NullPointerException pour myService wenn ich versuche, über das Drittanbieterpaket darauf zuzugreifen:

<context:component-scan 
base-package="com.myapp.mypackage, com.thirdparty.thirdpartypackage" />

Ich dachte, das würde funktionieren?

4voto

Bozho Punkte 570413

Bei Bibliotheken von Drittanbietern ist die übliche Vorgehensweise die Verwendung von xml:

<bean class="com.thirdparty.Foo">
    <property name="somePropertyWithASetter" ref="myService" />
</bean>

Sie können sich nicht auf Anmerkungen verlassen, da die Bibliothek des Drittanbieters höchstwahrscheinlich keine @Autowired .

0voto

Prasanna Talakanti Punkte 2324

Wenn das Paket eines Drittanbieters spring managed ist, ignorieren Sie bitte den Rest der Antwort

Ich denke, die Frage, die Sie sich vor tun Abhängigkeit Injektionen fragen sollten, ist, ist das Objekt Frühling verwaltet, um zu tun, dass entweder Sie sie in Frühling Kontext Xml definieren oder das Objekt mit (@component, @service Frühling Stereo Typ) annotieren

Betrachten wir den vorliegenden Fall

  1. Haben Sie Zugang zu diesem Quellcode von Drittanbietern?
  2. Verwendet der Drittanbieter Dependency Injection?
  3. Wenn die Antwort auf die obigen Fragen negativ ist, dann ist es nicht einfach, dies zu tun.
  4. Schauen wir uns das Beispiel von (MyService) an, was passiert, wenn dieses Dienstobjekt einen Zustand hat (da Spring-Objekte Singletons sind), auch wenn dieser Dienst kollaborierende Objekte hat, die nicht injiziert werden

    public class MyService {

      //depending on how MyServiceOne is managed makes it hard to retrofit 
      //MyService as a spring bean
      private MyServiceOne serviceone;
    
      //this also would have an adverse affect if you try use this as a spring managed
      //since all spring beans are singleton
      private String someState;
    
    }

0voto

unixorn Punkte 211

Haben Sie versucht, das Adaptermuster als Alternative zu verwenden? Ich glaube, dass Sie Folgendes verwenden können @Autowired auf dem Adapter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X