2012-04-11 8 views
20

Ich habe einen Grails-Dienst, der ein Wrapper um ein ziemlich kompliziertes Singleton-Objekt ist. Ich möchte eine Initialisierung durchführen, um den Singleton zu füllen, wenn der Dienst gestartet wird. Es wäre schön, wenn es eine Art von init() -Funktion gäbe, die automatisch vom Dienst beim Start aufgerufen würde, aber ich habe keine solche gefunden.Wie kann ich eine Initialisierungsfunktion für einen Grails-Dienst aufrufen?

Gibt es einen sauberen Weg, dies zu tun?

+0

Sie eine tatsächliche Nutzungsklasse bedeuten? – hvgotcodes

+0

Ja, eine Serviceklasse. –

Antwort

29

Sie InitializingBean von @Saurabh wie beschrieben implementieren können, aber das Feuer ziemlich früh im Grails Startvorgang, also, während es funktioniert, die einige Dinge, die gewonnen Wenn Sie noch nicht verfügbar sind, können Sie beispielsweise GORM-Methoden in Domänenklassen nicht aufrufen, da dies nach der Initialisierung der Bean geschieht. Wenn InitializingBean nicht ausreicht, können Sie eine Initialisierungsmethode von BootStrap.groovy, z.

class BootStrap { 

    def myService 

    def init = { servletContext -> 
     myService.initialize() 
    } 
} 

und Sie können die Methode aufrufen initialize oder was auch immer Sie in der Serviceklasse wollen. Sie können die Initialisierungsarbeiten auch direkt in BootStrap ausführen, wenn Sie diesen Code in der Serviceklasse nicht möchten.

+0

aufrufen Ich brauche diese GORM-Methoden, also denke ich, das ist der beste Weg. –

+0

Danke für Ihre Erklärung. Ja, es ist sinnvoll, BootStrap.groovy zur Initialisierung zu verwenden. – Saurabh

+0

Der Aufruf von Bootstrap ist eine gute Lösung und Sie können die Reihenfolge steuern, die Ihre Dienste initialisieren. Das heißt, ich denke, die Annotation @PostConstruct ist weniger Code, wenn Sie diese Kornkontrolle nicht benötigen. – alcoholiday

11

Server kann InitializingBean implementieren einige Initialisierung zu tun

public class AbcService implements InitializingBean { 

    public void afterPropertiesSet() throws Exception { 

    //initialization logic goes here 
    } 

    }  
} 
+0

GORM wird nicht verfügbar sein InitializingBean..Wenn Sie Gorm verwenden möchten, setzen Sie Initialisierungslogik in Bootstrap.groovy .. – Saurabh

+0

Ich muss an Daten arbeiten, die auf der Bean injiziert werden, keine externen Dienste, also bevorzuge ich die Initialisierungslogik und " Rufen Sie "innerhalb des gleichen Objekts, anstatt es in Bootstrap – zetta

20

Ich verwende den Standard PostConstruct Anmerkung:

class MyService {  

    @PostConstruct 
    def init() { 
     // GORM accesible from here 
    } 

} 
+0

Hier ist ein Link - http://www.intelligrape.com/blog/2012/08/27/using-postconstruct-annotation-with-grails-services/ – alcoholiday

+0

Aktualisierter Link: http: // www.tothernew.com/blog/using-postconstruct-annotation-with-grails-services/ –

Verwandte Themen