Quantcast
Channel: all and sundry
Viewing all articles
Browse latest Browse all 250

Learning Netflix Governator - Part 2

$
0
0
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.

Viewing all articles
Browse latest Browse all 250

Trending Articles