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> 这样就可以使容器启动时,就执行完成相应的初始化方法。
相关文章
相关标签/搜索