Roller guice框架的運用

     在*.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> 這樣就可以使容器啓動時,就執行完成相應的初始化方法。
相關文章
相關標籤/搜索