2012-04-11 12 views
20

Tengo un servicio de Grails que es un contenedor alrededor de un objeto singleton bastante complicado. Me gustaría inicializar un poco para completar el singleton cuando se inicia el servicio. Sería bueno si hubiera algún tipo de función init() que fuera llamada automáticamente por el servicio cuando se inicia, pero no he encontrado tal cosa.¿Cómo puedo llamar a una función de inicialización en un servicio de Grails?

¿Hay una manera limpia de hacer esto?

+0

que significa una clase de servicio activo? – hvgotcodes

+0

Sí, una clase de servicio. –

Respuesta

29

Puede implementar InitializingBean como se describe por @Saurabh pero que los incendios bastante temprano en el proceso de inicio Grails, así que mientras funciona, el son algunas cosas que ganaron Todavía no está disponible, por ejemplo, no puede llamar a los métodos GORM en las clases de dominio porque eso ocurre después de la inicialización del bean. Si InitializingBean no es suficiente, puede llamar a un método de inicialización desde BootStrap.groovy, p.

class BootStrap { 

    def myService 

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

y se puede llamar al método initialize o lo que usted quiere en la clase de servicio. También puede hacer el trabajo de inicialización directamente en BootStrap si no desea ese código en la clase de servicio.

+0

Voy a necesitar esos métodos GORM, así que supongo que esta es la mejor manera. –

+0

Gracias por su explicación. Sí, tiene sentido usar BootStrap.groovy para la inicialización. – Saurabh

+0

Llamar desde Bootstrap es una buena solución y le permite controlar el orden en que se inicializan sus servicios. Dicho esto, creo que la anotación @PostConstruct es menos código si no necesitas ese control de grano encontrado. – alcoholiday

11

Server puede aplicar InitializingBean hacer algo de inicialización

public class AbcService implements InitializingBean { 

    public void afterPropertiesSet() throws Exception { 

    //initialization logic goes here 
    } 

    }  
} 
+0

GORM no estará disponible InitializingBean..Si quiere usar Gorm, ponga la lógica de inicialización en Bootstrap.groovy .. – Saurabh

+0

Necesito trabajar en datos inyectados en el bean, no hay servicios externos, así que prefiero tener la lógica de inicialización y " llame "dentro del mismo objeto en lugar de llamarlo en bootstrap – zetta

20

utilizo la anotación PostConstruct estándar:

class MyService {  

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

} 
+0

Aquí hay un enlace - http://www.intelligrape.com/blog/2012/08/27/using-postconstruct-annotation-with-grails-services/ – alcoholiday

+0

Enlace actualizado: http: // www.tothenew.com/blog/using-postconstruct-annotation-with-grails-services/ –

Cuestiones relacionadas