Lifecycle Management essentially provides hooks into the different lifecycle phases that an object is taken through, to quote the wiki article on Governator:
Allocation (via Guice)
|
v
Pre Configuration
|
v
Configuration
|
V
Set Resources
|
V
Post Construction
|
V
Validation and Warm Up
|
V
-- application runs until termination, then... --
|
V
Pre Destroy
To illustrate this, consider the following code:
package sample.gov;
import com.google.inject.Inject;
import com.netflix.governator.annotations.AutoBindSingleton;
import sample.dao.BlogDao;
import sample.model.BlogEntry;
import sample.service.BlogService;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@AutoBindSingleton(baseClass = BlogService.class)
public class DefaultBlogService implements BlogService {
private final BlogDao blogDao;
@Inject
public DefaultBlogService(BlogDao blogDao) {
this.blogDao = blogDao;
}
@Override
public BlogEntry get(long id) {
return this.blogDao.findById(id);
}
@PostConstruct
public void postConstruct() {
System.out.println("Post-construct called!!");
}
@PreDestroy
public void preDestroy() {
System.out.println("Pre-destroy called!!");
}
}
Here two methods have been annotated with @PostConstruct and @PreDestroy annotations to hook into these specific phases of the Governator's lifecycle for this object. The neat thing is that these annotations are not Governator specific but are JSR-250 annotations that are now baked into the JDK.
Calling the test for this class appropriately calls the annotated methods, here is a sample test:
mport com.google.inject.Injector;
import com.netflix.governator.guice.LifecycleInjector;
import com.netflix.governator.lifecycle.LifecycleManager;
import org.junit.Test;
import sample.service.BlogService;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
public class SampleWithGovernatorTest {
@Test
public void testExampleBeanInjection() throws Exception {
Injector injector = LifecycleInjector
.builder()
.withModuleClass(SampleModule.class)
.usingBasePackages("sample.gov")
.build()
.createInjector();
LifecycleManager manager = injector.getInstance(LifecycleManager.class);
manager.start();
BlogService blogService = injector.getInstance(BlogService.class);
assertThat(blogService.get(1l), is(notNullValue()));
manager.close();
}
}
Spring Framework has supported a similar mechanism for a long time - so the exact same JSR-250 based annotations work for Spring bean too.
If you are interested in exploring this further, here is my github project with samples with Lifecycle management.
No comments:
Post a Comment