Guice-bootstrap
Guice-bootstrap is an extension of Guice that adds support for JSR 250 Life Cycle annotations.
@PostConstruct annotation is used on methods that need to get executed after dependency injection is done to perform any initialization.
@PreDestroy annotation is used on methods that are called before the application shuts down.
PostConstruct
Methods with @PostConstruct
annotation are called after all depedency injection is done.
import javax.annotation.PostConstruct;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyService implements Runnable
{
private final ExecutorService executor = Executors.newSingleThreadExecutor();
@PostConstruct
public void start() {
executor.submit(() -> { ... });
}
}
PreDestroy
Methods with @PreDestroy
annotation are called after the application shuts down.
import javax.annotation.PreDestroy;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
class MyService implements Runnable
{
private final List<File> files = new ArrayList<>();
@PreDestroy
public void cleanup() {
files.stream().forEach(file -> file.delete());
}
}
Bootstrap
Bootstrap is the main class to use guice-bootstrap.
Injector injector = new Bootstrap()
.addModules(new MyGuiceModule1(), new MyGuiceModule2(), ...)
.addModules(new MyGuiceModule3(), new MyGuiceModule4(), ...)
.initialize();
Overriding bindings
Bootstrap.overrideModulesWith method allows you to override bindings. This is useful to customize bindings defined by a base class.
// The base class
public class MyService {
public Bootstrap bootstrap()
{
return new Bootstrap()
.addModules(new MyGuiceModule1(), new MyGuiceModule2(), ...)
.addModules(new MyGuiceModule3(), new MyGuiceModule4(), ...)
;
}
public void start()
{
Injector injector = bootstrap().initialize();
...
}
}
// Extending class that overrides some bindings
public class MyExtendedService extend MyService {
@Override
public Bootstrap bootstrap()
{
return super()
.overrideModulesWith(new MyGuiceModule4(), ...)
;
}
}
CloseableInjector
Bootstrap.initialize()
sets up a shutdown hook to the Java VM (@Runtime.addShutdownHook`). It ensures that PostDestroy methods are called when Java VM exits even if it's killed by a SIGTERM or Ctrl-C.
But if you want to control the exact timing of shutdown, you can use Bootstrap.initializeCloseable()
instead. It returns CloseableInjector which implements Injector and Closeable interfaces.
Bootstrap bootstrap = new Bootstrap()
.addModules(...);
try (CloseableInjector injector = bootstrap.initializeCloseable()) {
...
}