guice - programacion - poo python 3
Guice llama al método init después de instanciar un objeto (5)
¿Es posible decirle a Guice que llame a algún método (es decir, init ()) después de crear un objeto de un tipo dado?
Busco una funcionalidad similar a la anotación @PostConstruct en EJB 3.
En realidad, es posible.
TypeListener
definir un TypeListener
para que la funcionalidad funcione. Algo parecido a lo siguiente en su definición de módulo:
bindListener(Matchers.subclassesOf(MyInitClass.class), new TypeListener() {
@Override
public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
typeEncounter.register(new InjectionListener<I>() {
@Override
public void afterInjection(Object i) {
MyInitClass m = (MyInitClass) i;
m.init();
}
});
}
});
GWizard incluye un módulo ( gwizard-services
) que proporciona servicios de Guava en un formato compatible con Guice. Los servicios de guayaba le permiten administrar el ciclo de vida en subprocesos paralelos.
Me gusta http://code.google.com/p/mycila/wiki/MycilaGuice . Esto es compatible con Guice 3, además de http://code.google.com/p/guiceyfruit .
Simplemente puede agregar la anotación @Inject
a su método init()
. Se ejecutará automáticamente después de que se crea una instancia del objeto.
code.google.com/p/guiceyfruit hace lo que está buscando para los métodos anotados con @PostConstruct
o implementando el InitializingBean
de Spring. También es posible escribir a tus propios oyentes para hacer esto. Aquí hay un ejemplo que llama a un método público init()
después de que se crean los objetos.
import com.google.inject.*;
import com.google.inject.matcher.*;
import com.google.inject.spi.*;
public class MyModule extends AbstractModule {
static class HasInitMethod extends AbstractMatcher<TypeLiteral<?>> {
public boolean matches(TypeLiteral<?> tpe) {
try {
return tpe.getRawType().getMethod("init") != null;
} catch (Exception e) {
return false;
}
}
public static final HasInitMethod INSTANCE = new HasInitMethod();
}
static class InitInvoker implements InjectionListener {
public void afterInjection(Object injectee) {
try {
injectee.getClass().getMethod("init").invoke(injectee);
} catch (Exception e) {
/* do something to handle errors here */
}
}
public static final InitInvoker INSTANCE = new InitInvoker();
}
public void configure() {
bindListener(HasInitMethod.INSTANCE, new TypeListener() {
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
encounter.register(InitInvoker.INSTANCE);
}
});
}
}