You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
株式会社DTS ネットワーク事業本部所属。Struts/Springベースのフレームワークの研究開発を中心に業務を行っている。また,フレームワークの利用や開発プロセスに関する講師も行っている。 株式会社DTS ネットワーク事業本部 プロジェクトマネージャ。Javaを中心にフレームワーク開発や開発プロセス定義など幅広く活躍中。StrutsIDEコミッタ。著書「まるごとEclipse! Vol.1」(発行:インプレスコミュニケーションズ)。 今回は,米GoogleがJavaで開発したDI(Dependency Injection)フレームワーク「Guice(ジュース)」を取り上げます。単体で使用することはもちろん,Webアプリケーションに組み込む方法や,Spring FrameworkやDWRとの連携も解説します。 XML定義ってうれしいですか? Springをはじめとするフレームワークにより
Java, Wicket いつか誰かがやると思ってましたが、ついにWicketのGoogle Guiceサポートが開発されたようです。Click Frameworkと並んで一番ホットなJavaウェブフレームワークであるWicketと、GoogleのDependency InjectionフレームワークGuiceがついに統合できるわけです。 Wicketには早くにSpring拡張機能が追加されていましたし、国内ではよういちろうさんによるS2WicketでSeasar 2もサポートされています。そこにGuiceが加わる。 Google GuiceはDIコンテナとしては異色の存在です。そのポリシーには「型安全性重視」とか「anti-static」とか書いてますし、あるいはXMLではなくてJavaコードでインターフェースと実装クラスを結びつけるというやり方を見ても、とてもJava寄り。最初にその発
1回目に続き、Spring Java Configurationを試してみたいと思います。今回はAOP。ちなみに付属のドキュメントにはAOPの説明が無かったので(さすがM1リリース)、テストケースを参考に試してみます。 Spring Java ConfigurationでのAOP定義 injectするServiceのインタフェースと実装クラス、そしてinjectされるClient実装クラスは、前回と同じものを使用します。AOPは既存の実装を変更せずに透過的に処理を追加(変更)できるのが売りですから、当然と言えば当然です。 で、前回のコンフィギュレーションクラスにAOPの定義を追加して、インターセプタも書いちゃいます。 @Configuration public class SpringConfigurationWithAOP { @Bean public Service service()
SpringFramework 2.0.4で、ちょうどベンチマークに関係する部分のパフォーマンスチューニングを行ったとの事なので(詳しくは次のエントリ参照)、再度ベンチマークを行いました。Seasar2も最新版に入れ替えた上で、セットアップ処理コードを一部変更しています。 計測内容 バージョンは、Spring 2.0.4 / Guice 1.0 / Seasar2 2.4.12 インスタンス取得はAOP有りとAOP無しの両方を計測(前回は有りのみでしたが、今回は無しも計測しました) 全てプロトタイプ(毎回新しいインスタンスを取得) 取得したインスタンスの実行時間は、AOP有りのみ計測(AOP無しは変わらないはずなので) 留意して欲しい事項は前回の前置きにあります ベンチマーク結果 - get instance (NO AOP)- Spring: 24,336 creations/s Gui
Guiceと Springframeworkの最大の違いはDIやAOPの設定をJavaコードで書くかXMLで書くかですが、実は(?)SpringでもJava コードによる設定の記述手段が用意されています*1。今回はその"Spring Java Configuration"を簡単に見てみます。なお、まだマイルストーン1なので、用意されているというよりは準備されている、もしくは計画中と言う方が適切かも知れず、今回試す内容も今後のリリースで色々変わる可能性があります。 Spring Java Configurationの最も基本的なサンプル まずinjectされるサービス。インタフェースとその実装です。 public interface Service { String getResponse(String msg); } public class ServiceImpl implements
GuiceはJavaのGenerics機能をフル活用したタイプセーフなフレームワークです。 私も、当初よりGenerics機能は、Javaの静的型付け言語的良さを強化する素晴らしい機能だと思っていましたが、実用方法としてはCollectionフレームワーク以上のものが思いつきませんでした。 しかし、Guiceはこれ以上ないほどの素晴らしい使いかたでGenericsを使い可能性を示しています。 Genericsの時代はいつか来るだろうと思っていましたが、それもGuiceの登場で案外早く来そうです。 ここでは、Moduleでの処理bind()メソッドと、その戻り値であるAnnotatedBindingBuilderインターフェイスのto()メソッドのソースを読み解いてみます。 そのなかでGnenericsの使い方を学んでいきましょう。 型 メソッド AbstractModuleクラス bind
AOP用途の73%を占めるトランザクション管理*1。これが分かればとりあえずGuiceを使ってみようという人が増えるかもしれないので、ちょっと試してみます。 トランザクション機能は他ライブラリを使う Guiceはトランザクションに関する機能を一切持っていません。ドキュメントを見ると"@Transactional"とか書いてあって紛らわしいのですが、「そういうアノテーションを使えば?」という程度の話です。なので、実際にトランザクション管理を行う場合は、自力で実装するか、他のライブラリの機能を使う事になります。今回はSpringのTransactionInterceptorを使ってみますが、Sesar2でもたぶん同じような事が出来ますし、ちょっとインターセプタを書けばHibernateのトランザクション機能を使う事も出来るはずです。 今回の要件 メソッドに@Transactionalと書くと、
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と同じものを使用しますので省略。
Spring統合の2回目の予定でしたが、前提としてProviderを理解していると良さそうだったので(というか、理解していないとAPIがよく分からなかったので)、予定を変更してProviderを見てみます。 Providerインタフェースは、Keyクラスと共にGuiceのDIの核となっているもので、一言で言うと「Guiceがinjectするインスタンスを提供するインタフェース」です。User's Guideに掲載されている図を引用します。 正確には原典を当たって頂くとして、Bindingはinjectする為の1組のマッピングで、Keyが「どこに(何に対して)injectするか」を示す値。Providerが、「injectするインスタンスを提供するインタフェース」です。つまり、色々なものをいっぱい省いて誤解を恐れつつ一言で言うと、「GuiceのDIとは、@Implementアノテーションがつ
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
GuiceはSpringと統合する為のクラスを用意しています。その名もずばりSpringIntegration。統合と言っても様々な形態が考えられると思いますが、現時点でGuiceが用意しているのは、Springのコンテナで管理されているBeanをGuiceから取得/injectできるようにするものです。それほど凝った事はしていなくて、シンプルなBeanFactoryのラッパーとなっています。 SpringIntegrationクラスにはpublicメソッドが2つしか無いので、両方見てみます。今回はbindAll()メソッド。 SpringIntegration#bindAllメソッドを呼び出すと、Springに名前で登録されているBeanが全てGuiceに登録されます。その際、Guiceコンテナに登録されるインデックス(Keyクラス)は「型と名前のセット」になっています。JavaDocに
いくつか手段があります。 アノテーションそのもので区別。 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; } } /** 実装
ちょっと数字を出す事の責任を感じてます…。 前置きさせて下さい。 ベースとなっているGuice付属のソースのJavaDocコメントには、以下の文で始まっています。"A semi-useless microbenchmark." 誤解を恐れつつ言えば、このマイクロベンチマークは「大豆100粒を箸で移す競争」みたいなものではないかと。速いにこした事はないですが、それがどれだけ食事の速さにつながるかは、料理や食べ方次第で全く違う、という。…いや、全然うまい事言えてないですね。 という事で、コンテナからのインスタンス取得処理と、取得した1つのインスタンスをひたすら呼び出す処理を分けて計測しました。前者を全フレームワークで実行→後者を全フレームワークで実行、という順序です。 - get instance from factory - Spring: 1,891 creations/s Guice:
すみません、以前のSpringとGuiceのAOPパフォーマンス比較ですが、テストコードに間違いがありまして、条件が同じになってませんでした。 Guiceは毎回エンハンスしたインスタンスを作っていた一方、Springは1つのProxyを使い回していたという…。数字を見て何らかの感想をもってしまった方、本当にすみません。 // 訂正前(デフォルトなのでシングルトン) RootBeanDefinition proxy = new RootBeanDefinition(ProxyFactoryBean.class); // 訂正後(シングルトン指定をfalseに) RootBeanDefinition proxy = new RootBeanDefinition(ProxyFactoryBean.class, false); 修正後の計測結果は次の記事にあります。
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
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く