Learning Netflix Governator – Part 2
To continue from the previous entry on some basic learnings on Netflix Governator, here I will cover one more enhancement that Netflix Governator brings to Google Guice – Lifecycle Management
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.
Reference: | Learning Netflix Governator – Part 2 from our JCG partner Biju Kunjummen at the all and sundry blog. |