Google Guice: IoC revisited
Google has made public his IoC container. It's all annotations based, no more strings, no more XML.
Some key concepts:
- Avoid string based injection which are error prone and hard to refactor
- @Inject actually inject :-)
- @ImplementedBy(ServiceImpl.class). A service can have a default implementation, use by default when no wiring is explicit. The actual implementation is easily identified, including by your IDE...
- Injection through custom annotations (even parameterized): useful when you need to bind 2 services implementations and use one or the other. Also useful to bind constants: Guice allows you to bind a constant to an annotation.
- Scoping: injections are scoped, and you can create you own scope (transaction). Inner scopes can see outer scopes.
- Because it's Bob Lee: Guice has integration with AOP Alliance is supported
Basic injection
public class Client {
private final Service service;
@Inject
public Client(Service service) {
this.service = service;
}
public void go() {
service.go();
}
}
Default for autowiring
@ImplementedBy(ServiceImpl.class)
public interface Service {
void go();
}
Custom annotations
bind(Service.class)
.annotatedWith(Blue.class)
.to(BlueService.class);
...
@Inject
void injectService(@Blue Service service) {
...
}
What I really like:
- Annotation based, easy to read and concise
- Injection on methods (not only setters)
- @ImplementedBy: Most services, they are implemented one and only one time.
I remember the old days of Pico vs Spring vs Avalon. I'm happy to see innovation flowing again in this field. Some took for granted that Spring was the only way, then come annotations. JBoss Seam and its annotation based stateful injection / outjection, and now Google Guice: both share some of the interesting concepts I described earlier. Component injection is revisited and it's good.
Now remember, IoC is not application development, it's at best a part of it :-). To me, the programmation model with the biggest/homogeneous picture is JBoss Seam.
Comments