在*.java文件中搜索 bind方法能夠發如今JPAPlanetModule.java、JPAWebloggerModule.java、RollerPlanetModule.java文件中使用了google的guice框架的bind方法。 java
也就是把java 接口和實現類綁定起來。
如:
binder.bind(WeblogManager.class).to( JPAWeblogManagerImpl.class);
這樣在使用時只須要這樣作: web
@com.google.inject.Inject
protected JPAWeblogEntryManagerImpl(Weblogger roller, JPAPersistenceStrategy strategy) {
log.debug("Instantiating JPA Weblog Manager");
this.roller = roller;
this.strategy = strategy;
}
看來是按照類型,以參數的形式注入的。 這樣用起來仍是簡單。
可是注入的入口方法在哪裏呢? 搜索JPAWebloggerModule 在roller.properties中發現這樣的配置 apache
# Backend Guice module
guice.backend.module=org.apache.roller.weblogger.business.jpa.JPAWebloggerModule
而後搜索guice.backend.module 能夠發現 bootstrap
/**
* Instantiate a new GuicePlanetProvider using default guice module
* configured in PlanetConfig via 'guice.backend.module' property.
*/
public GuicePlanetProvider() {
String moduleClassname = PlanetConfig.getProperty("guice.backend.module");
if(moduleClassname == null) {
throw new NullPointerException("unable to lookup default guice module via property 'guice.backend.module'");
}
try {
Class moduleClass = Class.forName(moduleClassname);
Module module = (Module)moduleClass.newInstance();
injector = Guice.createInjector(module);
} catch (Throwable e) {
// Fatal misconfiguration, cannot recover
throw new RuntimeException("Error instantiating backend module " + moduleClassname, e);
}
}
這個就是guice的入口方法。
可是這個方法是哪裏調用的呢?搜索發現 在roller.properties中定義了這個配置
# Backend Provider
weblogger.provider.class=org.apache.roller.weblogger.business.GuiceWebloggerProvider
發如今 WebloggerFactory.java文件中有
public static final void bootstrap() throws BootstrapException {
// if the app hasn't been properly started so far then bail
if (!WebloggerStartup.isPrepared()) {
throw new IllegalStateException("Cannot bootstrap until application has been properly prepared");
}
// lookup our default provider and instantiate it
WebloggerProvider defaultProvider;
String providerClassname = WebloggerConfig.getProperty("weblogger.provider.class");
if(providerClassname != null) {
try {
Class providerClass = Class.forName(providerClassname);
defaultProvider = (WebloggerProvider) providerClass.newInstance();
} catch (Exception ex) {
throw new BootstrapException("Error instantiating default provider: "+providerClassname, ex);
}
} else {
throw new NullPointerException("No provider specified in config property 'weblogger.provider.class'");
}
// now just bootstrap using our default provider
bootstrap(defaultProvider);
}
反射調用。
在rollerContextd.java 這個類實現了以下接口
public class RollerContext extends ContextLoaderListener implements ServletContextListener
在 public void contextInitialized(ServletContextEvent sce) 方法中有調用
// trigger bootstrapping process
WebloggerFactory.bootstrap();
而org.apache.roller.weblogger.ui.core.RollerContext 定義在web.xml 中
<listener>
<listener-class>org.apache.roller.weblogger.ui.core.RollerContext</listener-class>
</listener> 這樣就可以使容器啓動時,就執行完成相應的初始化方法。