Guice指南-與 JNDI 整合

梧桐雨—168發表於2008-03-26
 
例如我們需要繫結從 JNDI 得到的物件。我們可以仿照下面的程式碼實現一個可複用的定製的提供者。注意我們注入了 JNDI Context:

package mypackage;

import com.google.inject.*;
import javax.naming.*;

class JndiProvider implements Provider {

  @Inject Context context;
  final String name;
  final Class type;

  JndiProvider(Class type, String name) {
    this.name = name;
    this.type = type;
  }

  public T get() {
    try {
      return type.cast(context.lookup(name));
    }
    catch (NamingException e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * Creates a JNDI provider for the given
   * type and name.
   */
  static Provider fromJndi(
      Class type, String name) {
    return new JndiProvider(type, name);
  }
}

感謝型擦除(generic type erasure)技術。我們必須在執行時將依賴傳入類中。你可以省略這一步,但在今後跟蹤型別轉換錯誤會比較棘手(當 JNDI 返回錯誤型別的物件的時候)。

我們可以使用定製的 JndiProvider 來將 DataSource 繫結到來自 JNDI 的一個物件:

import com.google.inject.*;
import static mypackage.JndiProvider.fromJndi;
import javax.naming.*;
import javax.sql.DataSource;

...

// Bind Context to the default InitialContext.

bind(Context.class).to(InitialContext.class);

// Bind to DataSource from JNDI.
bind(DataSource.class)
    .toProvider(fromJndi(DataSource.class, "..."));

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-217873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章