2017-05-05 10 views
0

Ich habe eine Instanz einer Klasse, die außerhalb von Spring erstellt wurde, dass ich Springbohnen zugreifen möchte, so dass es ein Ereignis auslösen und von Spring Beans beobachtet werden kann. Ich verwende kein Spring Web, meine Anwendung läuft von der Kommandozeile aus über Spring Boot.Spring Boot-Anwendung - Bean aus dem statischen Kontext

Antwort

0

Sie können Konstruktor injizieren, die Bohnen entspringen, so etwas wie:

@Service 
class Bean { 
    ... 
} 

class NotBean { 

     private Bean bean; 

     public NotBean(Bean bean) { 
     this.bean = bean; 
     } 

     // your stuff (handle events, etc...) 
} 
+0

Ich habe keine Kontrolle darüber, wie die anderen NotBean instanziert wird, daher kann ich nicht einfach die Bohne Bezug auf es passiert ... – Walter

+0

Können Sie von diesem NotBean verlängern? –

2

Die einzige Option, die Sie haben, ist die Feder Kontext Ihrer Anwendung mit einer statischen Methode zu belichten, so dass das Objekt, das von nicht verwaltet wird Spring kann damit Referenzen auf verwaltete Beans verwenden, die es benötigt.

  1. Beginnen Sie mit einem Wrapper für den Kontext. Erstellen Sie eine regulär verwaltete Bean, die einen Verweis auf den Kontext in ihrem Konstruktor benötigt. Die Referenz wird auf ein statisches Klassenfeld zugeordnet, die auch eine statische Getter hat:

    @Service 
    class ContextWrapper { 
    
        private static ApplicationContext context; 
    
        @Autowired 
        public ContextWrapper(ApplicationContext ac) { 
         context = ac; 
        } 
    
        public static ApplicationContext getContext() { 
         return context; 
        } 
    
    } 
    
  2. die statische Getter Einsatz im Objekt Zugang zum Kontext zu erhalten, die nicht von Spring verwaltet wird und Bezug auf Bohnen erhalten Methoden erhältlich im Kontext:

    SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class); 
    // do something with the bean 
    
  3. das Letzte, was Sie brauchen, ist Kommunikationskanal von Spring-beans auf nicht verwalteten Objekt. Zum Beispiel kann die SomeBean einen Setter verfügbar machen, der das nicht verwaltete Objekt als Parameter akzeptiert und die Referenz in einem Feld zur zukünftigen Verwendung speichert. Der Objekt-Mast ruft Verweise auf verwaltete Beans mit dem oben erwähnten statischen Kontext-Accessor ab und verwendet den Setter, um die Bean auf ihre Existenz aufmerksam zu machen.

    @Service 
    class SomeBean { 
    
        // ... your bean stuff 
    
        private SomeClass someclass; 
    
        public void setSomeClass(Someclass someclass) { 
         this.someclass = someclass; 
        } 
    
        private void sendEventToSomeClass() { 
         // communicate with the object not managed by Spring 
         if (someClass == null) return; 
         someClass.sendEvent(); 
        } 
    
    } 
    
+0

Wie kann ich sicherstellen, dass der Kontext nicht null oder nicht vollständig geladen ist? Kann ich mich darauf verlassen, dass getContext() den vollen Frühlingskontext zurückgibt und warum? – user7294900

+0

Wenn Ihre Spring-Anwendung gestartet wurde, muss der Kontext korrekt erstellt werden. Das einzige, was Sie beachten müssen, ist, dass Sie die 'getContext()' - Methode nicht in Konstruktoren Ihrer Beans verwenden sollten, da die Beans-Konstruktion Teil der Kontexterstellung ist. –

+0

Wenn ich von einer ** normalen (nicht Spring-) Klasse ** ausrufe, um eine Bohne zu bekommen, kann ich annehmen, dass der Frühlingskontext bereits begonnen hat? Muss check/function hinzugefügt werden, um sicherzustellen, dass der Spring-Kontext nicht null oder nicht vollständig geladen ist? – user7294900

Verwandte Themen