タグ

guiceとgoogleに関するhiro360のブックマーク (18)

  • (その14)トランザクション管理 - あるまに

    AOP用途の73%を占めるトランザクション管理*1。これが分かればとりあえずGuiceを使ってみようという人が増えるかもしれないので、ちょっと試してみます。 トランザクション機能は他ライブラリを使う Guiceはトランザクションに関する機能を一切持っていません。ドキュメントを見ると"@Transactional"とか書いてあって紛らわしいのですが、「そういうアノテーションを使えば?」という程度の話です。なので、実際にトランザクション管理を行う場合は、自力で実装するか、他のライブラリの機能を使う事になります。今回はSpringのTransactionInterceptorを使ってみますが、Sesar2でもたぶん同じような事が出来ますし、ちょっとインターセプタを書けばHibernateのトランザクション機能を使う事も出来るはずです。 今回の要件 メソッドに@Transactionalと書くと、

    (その14)トランザクション管理 - あるまに
  • (その13) Springframeworkとの統合(2) Spring管理のBeanをGuiceに個別登録 - あるまに

    Springとの統合手段2つ目、SpringIntegration#fromSpringメソッドについてです。 fromSpring()メソッドのインタフェースは以下のようになっています。 /** Creates a provider which looks up objects from Spring using the given name. */ public static <T> Provider<T> fromSpring(Class<T> type, String name) 戻りの型Providerは前回見た通り、injectするインスタンスを提供するインタフェースです。JavaDocコメントによれば、Springから指定した名前でオブジェクトを取得してくれるそうです。 fromSpring()を使ってみる。 XML定義とBean関連はその11と同じものを使用しますので省略。

    (その13) Springframeworkとの統合(2) Spring管理のBeanをGuiceに個別登録 - あるまに
  • (その12) Providerについて - あるまに

    Spring統合の2回目の予定でしたが、前提としてProviderを理解していると良さそうだったので(というか、理解していないとAPIがよく分からなかったので)、予定を変更してProviderを見てみます。 Providerインタフェースは、Keyクラスと共にGuiceのDIの核となっているもので、一言で言うと「Guiceがinjectするインスタンスを提供するインタフェース」です。User's Guideに掲載されている図を引用します。 正確には原典を当たって頂くとして、Bindingはinjectする為の1組のマッピングで、Keyが「どこに(何に対して)injectするか」を示す値。Providerが、「injectするインスタンスを提供するインタフェース」です。つまり、色々なものをいっぱい省いて誤解を恐れつつ一言で言うと、「GuiceのDIとは、@Implementアノテーションがつ

    (その12) Providerについて - あるまに
  • おおたに6号機の春なりかけ。 - Guice User's Guide

    id:iad_otomamayさんがGuiceのユーザーガイドを翻訳(すげーはえー!)してくれてたので、 一覧にしてみた。ありがとうございます、あとでじっくり読ませてもらいます>id:iad_otomamayさん Guice User's Guide ■Java on Guice ■1. Introduction ■2. Plain Old Factories ■3. Dependency Injection By Hand 続きを読む JavaExpressの後継として、新たにJavaExpertが創刊されます。 このJavaExpertの特集2として、id:yone098さん、id:manholeさんと 一緒にTeedaの入門記事を書かせていただきました。 TeedaCoreから始まり、Extension、Ajaxと全部をまとめて紹介するのはこれが初めてじゃないでしょうか。 もちろんS

    おおたに6号機の春なりかけ。 - Guice User's Guide
  • パフォーマンス計測コード公開 - あるまに

    下記のWikiに公開しました。ソースの直接貼り付けは書き方が分からなかったので、添付ファイルになっています。 修正、追加、ブラッシュアップなど大歓迎です。 http://www.wikihouse.com/arumani/index.php?Guice%2C%20Sring%2C%20S2%20%A5%D1%A5%D5%A5%A9%A1%BC%A5%DE%A5%F3%A5%B9%C8%E6%B3%D3

    パフォーマンス計測コード公開 - あるまに
  • (その11) Springframeworkとの統合(1) Spring管理のBeanをGuiceに一括登録 - あるまに

    GuiceはSpringと統合する為のクラスを用意しています。その名もずばりSpringIntegration。統合と言っても様々な形態が考えられると思いますが、現時点でGuiceが用意しているのは、Springのコンテナで管理されているBeanをGuiceから取得/injectできるようにするものです。それほど凝った事はしていなくて、シンプルなBeanFactoryのラッパーとなっています。 SpringIntegrationクラスにはpublicメソッドが2つしか無いので、両方見てみます。今回はbindAll()メソッド。 SpringIntegration#bindAllメソッドを呼び出すと、Springに名前で登録されているBeanが全てGuiceに登録されます。その際、Guiceコンテナに登録されるインデックス(Keyクラス)は「型と名前のセット」になっています。JavaDocに

    (その11) Springframeworkとの統合(1) Spring管理のBeanをGuiceに一括登録 - あるまに
  • (その10) 同じ型で異なる実装クラスをinjectしたい場合 - あるまに

    いくつか手段があります。 アノテーションそのもので区別。 ex ) @JasracService / @ElicenseService アノテーションで指定する文字列で区別。 ex) @Named("JASRAC") / @Named("eLicense") 以下、それぞれ見ています。 アノテーションそのもので区別 どの実装をinjectするかを、アノテーションで指定する方法です。まずインタフェースと実装クラス。 public interface Service { String getResponse(String msg); /** 実装その1 */ class TypeAServiceImpl implements Service { public String getResponse(String msg) { return "TypeA : " + msg; } } /** 実装

    (その10) 同じ型で異なる実装クラスをinjectしたい場合 - あるまに
  • (その9)AOP含めたパフォーマンス比較を再度 - あるまに

    ちょっと数字を出す事の責任を感じてます…。 前置きさせて下さい。 ベースとなっているGuice付属のソースのJavaDocコメントには、以下の文で始まっています。"A semi-useless microbenchmark." 誤解を恐れつつ言えば、このマイクロベンチマークは「大豆100粒を箸で移す競争」みたいなものではないかと。速いにこした事はないですが、それがどれだけ事の速さにつながるかは、料理べ方次第で全く違う、という。…いや、全然うまい事言えてないですね。 という事で、コンテナからのインスタンス取得処理と、取得した1つのインスタンスをひたすら呼び出す処理を分けて計測しました。前者を全フレームワークで実行→後者を全フレームワークで実行、という順序です。 - get instance from factory - Spring: 1,891 creations/s Guice:

    (その9)AOP含めたパフォーマンス比較を再度 - あるまに
  • 訂正:AOPパフォーマンス比較 - あるまに

    すみません、以前のSpringとGuiceのAOPパフォーマンス比較ですが、テストコードに間違いがありまして、条件が同じになってませんでした。 Guiceは毎回エンハンスしたインスタンスを作っていた一方、Springは1つのProxyを使い回していたという…。数字を見て何らかの感想をもってしまった方、当にすみません。 // 訂正前(デフォルトなのでシングルトン) RootBeanDefinition proxy = new RootBeanDefinition(ProxyFactoryBean.class); // 訂正後(シングルトン指定をfalseに) RootBeanDefinition proxy = new RootBeanDefinition(ProxyFactoryBean.class, false); 修正後の計測結果は次の記事にあります。

    訂正:AOPパフォーマンス比較 - あるまに
  • (その8) Seasar2をAOPパフォーマンス比較対象に追加 - あるまに

    id:koichikさんに「S2も比較に追加して」というコメントを頂いたので、言われた通りの方法で追加して試しました。Seasar2のテストコードはま!さんのSeasar2用コードにkoichikさんの記述を追加しただけのものです。Seasar2は触った事がないのでシングルトンかどうか分からなかったのですが、デバッグしながら見たらinjectされたオブジェクトのIDが呼び出しのたびに異なっていたので、毎回インスタンス化しているのだろう(=条件は同じだろう)と判断しました。また、上記Springの訂正も含まれています。 最初の3回の結果は以下です。Springにとってはちょっと…. Spring: 1,734 creations/s Guice: 35,161 creations/s S2: 18,395 creations/s Spring: 1,776 creations/s Guice

    (その8) Seasar2をAOPパフォーマンス比較対象に追加 - あるまに
  • 番外編。スレッドセーフ - あるまに

    Injectorはスレッドセーフだそうです。Injectorはインタフェースだから表現が若干不正確な気もするけど。

    番外編。スレッドセーフ - あるまに
  • Google Guice(その7) 実装クラスの指定方法 - あるまに

    インタフェースの実装クラスを指定する方法は、その2で書いたbind(インタフェース).to(実装クラス);が基です。しかし他にもいくつかあって、その中でもちょっと毛色が違う@ImplementedByアノテーションを紹介します。 これはインタフェースにアノテーションで実装クラスを指定する方法です。 @ImplementedBy(ServiceImpl.class) public interface Service { String getResponse(String msg); } bind()で実装クラスを指定したらそちらが優先、指定が無ければこのアノテーション指定が使われるので、デフォルトの実装をアノテーションで指定しておき、必要があった時だけbind()で上書きするという使い方ができます。 指定が無くてよいので、呼び出し側は↓だけ。 public class Main { pub

    Google Guice(その7) 実装クラスの指定方法 - あるまに
  • Google Guice(その6) AOP使用時のパフォーマンス比較 - あるまに

    ※下記はコードが間違っていて訂正したので、その8をご参照下さい。 その5でid:shot6さんにコメントを頂いた事もあり、AOP使用時のパフォーマンスを比較してみます。 使うのは、Guice付属のパフォーマンス比較コードにAOP設定とAOPを挟んだメソッドの呼び出しを追加したものです。 SpringのAOPはとりあえずノーマルなProxyで。 // 設定 RootBeanDefinition proxy = new RootBeanDefinition(ProxyFactoryBean.class); MutablePropertyValues proxyValues = new MutablePropertyValues(); proxyValues.addPropertyValue("target", new RuntimeBeanReference("barImpl")); prox

    Google Guice(その6) AOP使用時のパフォーマンス比較 - あるまに
  • Google Guice(その5) パフォーマンス比較 - あるまに

    Guiceのテストコードに含まれる、パフォーマンス比較測定を実行してみます。 内容は、以下のような依存関係を持たせたオブジェクトをひたすらコンテナから取得し続けて、1秒間に取得できた回数を表示するというものです。 Foo foo = new Foo(); foo.setI(5); foo.setS("test"); Bar bar = new BarImpl(tee, 5); Bar copy = new BarImpl(tee, 5); foo.setBar(bar); foo.setCopy(copy); さて、実行したら*1以下のような結果が10回表示されました(どれも近い数値だったので1回分) Spring: 3,603 creations/s Guice: 152,207 creations/s By Hand: 6,666,666 creations/s GuiceはSprin

    Google Guice(その5) パフォーマンス比較 - あるまに
  • Google Guice(その4) メソッドやコンストラクタへのInject指定 - あるまに

    その2で書いたコードでは、下記のようにフィールドに@Injectを宣言してInjectしてました。 @Inject private Service service; GuiceはもちろんメソッドやコンストラクタにもInject出来ます。 import sample.guice.service.Service; import com.google.inject.Inject; public class InjectSample { // フィールド @Inject private Service service; // コンストラクタ @Inject public InjectSample(Service service) { System.out.println("コンストラクタ <" + service + ">"); } // メソッド @Inject public void inje

    Google Guice(その4) メソッドやコンストラクタへのInject指定 - あるまに
  • Google Guice(その3) AOP - あるまに

    何ヶ月か前にGuiceを見た時AOPが見当たらなかったので「これじゃSpringの代替としては使えん」と思っていたのですが、AOPが使えるようになっています。または、当時見つけられなかった私にも見つけられるようになりました。 その1で書いたように、GuiceのAOPは非常にシンプル、その分高速に作ってあるそうです。AOP Alliance APIに準拠していますので、Springのインターセプタが使えるとの事。これは嬉しいですね。 という事で簡単なサンプルとして、AOPのお約束であるログ出力を。GuiceのUser's Guideでは後ろの方に数行しか記述が無いので、テストコードを見つつやってみました。 まずログを出力するインターセプタを新たに作成。 import org.aopalliance.intercept.MethodInterceptor; import org.aopalli

    Google Guice(その3) AOP - あるまに
  • Google Guice(その2) 最も単純にInjectするサンプル - あるまに

    一番単純なサンプルを、ユーザガイドから少し変えて書いてみます。あ、このドキュメントGoogle Docsだ。 構成は以下。 Service Injectするインタフェース ServiceImpl Injectするインタフェースの実装クラス Client ServiceがInjectされるクラス Main 起動クラス まずServiceとServiceImpl。 public interface Service { String getResponse(String msg); } public class ServiceImpl implements Service { public String getResponse(String msg) { return "Re: " + msg; } } 当たり前ですが、POJOです。そしてServiceを呼び出すClient。 import c

    Google Guice(その2) 最も単純にInjectするサンプル - あるまに
  • Google Guice(その1) 概要 - あるまに

    以前同僚のM君より存在を教えてもらったGoogleのDIコンテナGuiceですが、めでたく1.0になったようなのでちょっと見てました。 一言で言うと、「アノテーションとジェネリクスを使い、パフォーマンスを重視し、DIに特化したDIコンテナ」のようです。 とりあえず、「何で新しくDIコンテナ作ったの?」「Springとの違いは?」というのが万人共通の疑問だと思うので、まさにそれに答えているページをまず見てみました。 http://code.google.com/p/google-guice/wiki/SpringComparison より。記述順序や訳はかなりいい加減なので、ちゃんと読みたい方は上記URLを参照下さい。 発音:「ジュース」*1 Springについて SpringによってDIがメジャーになった。Springが無かったらGuiceは無かったかも(少なくとももっと遅かった) Spr

    Google Guice(その1) 概要 - あるまに
  • 1