Revision: 1399
Author: sberlin
Date: Sat Nov 20 19:41:40 2010
Log: Created wiki page through web user interface.
http://code.google.com/p/google-guice/source/detail?r=1399
Added:
/wiki/InspectingModules.wiki
=======================================
--- /dev/null
+++ /wiki/InspectingModules.wiki Sat Nov 20 19:41:40 2010
@@ -0,0 +1,55 @@
+#summary Introspecting what makes up a Module
+
+
+=Elements SPI=
+
+Guice provides a rich service provider interface (SPI) for all the
elements that make up a module. You can use this SPI to learn what
bindings are in a module and even rewrite some of those bindings.
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)
Modules.override] is written entirely using this SPI.
+
+==Examining Elements==
+
+The
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/Elements.html
Elements] class provides access to each
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/Element.html
Element] within a Module. You can use this class to get individual
elements from a module and take action upon them. Each Element has an
acceptVisitor method that takes an
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/ElementVisitor.html
ElementVisitor]. You can use
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultElementVisitor.html
DefaultElementVisitor] to simplify writing a visitor.
+
+{{{
+ void warnAboutStaticInjections(Module... modules) {
+ for(Element element : Elements.getElements(modules)) {
+ element.acceptVisitor(new DefaultElementVisitor<Void>() {
+ @Override public void visit(StaticInjectionRequest request) {
+ System.out.println("You shouldn't be using static injection
at: " + request.getSource());
+ }
+ });
+ }
+ }
+}}}
+
+==Manipulating Modules==
+
+You can use the SPI to do anything from stripping out elements to
rewriting elements to adding new elements. When you've finished wiring
your elements, you can turn them back into a module.
+
+{{{
+ Module stripStaticInjections(Module... modules) {
+ final List<Element> noStatics = Lists.newArrayList();
+ for(Element element : Elements.getElements(modules)) {
+ element.acceptVisitor(new DefaultElementVisitor<Void>() {
+ @Override public void visit(StaticInjectionRequest request) {
+ // override to not call visitOther
+ }
+
+ @Override public void visitOther(Element element) {
+ noStatics.add(element);
+ }
+ });
+ }
+ return Elements.getModule(noStatics);
+ }
+}}}
+
+==Binding Binoculars==
+
+The most common Element is a [Bindings Binding]. Bindings have more
configuration than other elements and can be inspected in more ways. You
can visit a binding's scope using
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html#acceptScopingVisitor(com.google.inject.spi.BindingScopingVisitor<V>)
Binding.acceptScopingVisitor], or figure out what kind of binding it is
using
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html#acceptTargetVisitor(com.google.inject.spi.BindingTargetVisitor<?
super T, V>) Binding.acceptTargetVisitor]. Each of these methods have
their own default visitors (
+[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultBindingScopingVisitor.html
DefaultBindingScopingVisitor]
and
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultBindingTargetVisitor.html
DefaultBindingTargetVisitor], respectively) to make visiting easier.
+
+Bindings can either be "Module bindings" or "Injector bindings". Injector
bindings are bindings retrieved from an injector (see the
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Injector.html
Injector javadoc]). Module bindings are bindings retrieved using the
Elements SPI. The
[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html
Binding javadoc] explains the difference between these in more detail.
+
+== Extensions==
+
+Guice 3.0 adds the ability for extensions to write their own SPI. See
[ExtensionSPI] for details.
--
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en.