超軽量級DI容器フレームGoogle GuiceとSpringフレームの違い教程詳細とそのdemoコードセグメントを共有する
オリジナルは容易ではないです.転載は出典を明記してください.超軽量級DI容器フレームGoogle GuiceとSpringフレームの違いは教程詳細とそのdemoコードセグメントを共有します.
コードのダウンロード先:http://www.zuidaima.com/share/1759689106541568.htm
注入に依存して、DI(Dependency Injection)はもちろん、DI容器、例えばspring、ピココンタイナー、EJB容器など、最近、googleがより軽いDI容器を誕生しました.Guice!余計なことを言わないで、まずGuiceがどのように注入を実現するかを見てみましょう.簡単なサービスインターフェースとその実現を定義しましょう.
GuiceのModuleファイルを定義し、容器に注入する方法を教えます.
Guiceには他にどのような使用特性がありますか?1,MyService定義の対象を確定するためにMyServiceImplとして注射されます.他の実装ではなく、MyServiceインターフェースに@ImplementendBy(MyServiceImpl.class)を追加することができます.
2,Fieldに対して注釈式でCient.javaに注入してもいいです.これを@InjectとMyServiceに表記してもいいです. サービスの前に、例えば:@Inject MyService service;
3、カスタムAnnotationの表示が使用できます.
binder.bind(MyService.class).annotatedWith(MyInterface.class).to( MyServiceImpl.class).in(Scoopes.SINGLETON)MyInterfaceと表示されているMyService定義の対象に対して注入するという意味です.
Annotationの表示を行うメンバー(Field、method、argmentなど)は、この属性を持っており、実行可能であり、これらのメンバーの属性によって、いくつかの異なることを行う.例えば、springのAsppectJ、xdocletなど.
下は私が比較してみました.
GuiceとSpringの対比
Spring
Guice
XMLを使う
クラスとクラスの関係をxmlに分離し、呼び出されたオブジェクトの注入を容器が担当するので、依存注入といいます.
xmlを使用しないで、クラスとクラスの関係をModuleに分離して、名声はどこに注入する必要がありますか?
Annotationを使う
ユーザー定義のAnnotation表示をサポートするために、同じインターフェース定義のオブジェクト参照に対して、それぞれのユーザー定義のAnnotationコメントを表示すると、同じクラスの中の同じインターフェースの参照に達することができます.異なる実装に注射します.Moduleでは、表記で区別して、柔軟性が大幅に増加します.Annotationを使うのもいいこととは限らないです.范型などの新特性もいいこととは限らないです.今はほとんどのサーバーがjdk 1.5をサポートしていません.wlsは9以前からサポートしていますが、今のお客様は価格の原因でwls 9を選択することが少ないです.少なくとも私達がやったプロジェクトの中には全部ありません.機能がもっと強くて、お客さんが必要ではないです.どう使いますか?
運転効率
springプロファイルを読み込むには、解析xmlが必要で、効率が低く、getBenも効率が高くないが、使用環境はgetBenには及ばず、生産環境の時のみgetBenを使用し、springアプリケーションを搭載する時には、注射は全部完了しているので、この低効率の問題は問題ではない.
Annotationを使って、cglibは、効率がよくスプリングと一番明らかな違いがあります.springはspringプロファイルを搭載する時に注入したところを全部注入しました.Guiceは使用する時に注射します.運行効率と柔軟性が高いです.
結合結合
結合度が低く、クラスが侵入しないことを強調し、外部化された方式で依存関係を処理します.クラスの中はとても清潔で、配置ファイルの中で文章を作ります.クラスに対する依存性は極めて低いです.
高、コードレベルの表示、DIマーク@injectがコードに侵入して、クラスレベルに結合して、侵入するどころか、まるで侵略的で、コードが多すぎるguiceを結合したものは、注入に依存する初心を大きく逸脱しました.コードの維持性に対して、読み取り可能性はすべて不利です.
クラス作成時
xmlを作成し、ビーンを配置し、注入を配置する必要があります.
声明を@injectとするだけで、注入されるのを待って、最終的には統一されたModuleに注入方式を宣言します.
IOCのみ対応
いいえ、スプリングは今多くの部分を渉猟しました.
はい、今はDI容器だけです.
コード再構成が容易かどうか
統一されたxml配置の入り口は、変更が容易です.
設定作業はModuleで行います.spring異曲と同じです.
複数の注入方式に対応
コンストラクタ,setter方法
Field,コンストラクタ,setter方法
融通性
1,同じインターフェース定義の引用は異なる実装を注入する必要がある場合、異なるModuleを作成します.煩わしいです.2、ダイナミック注入をしたいなら、注射の一つの実現はまだ分かりません.どうすればいいですか?springは仕方がないです.事前に配置ファイルに書いてください.Guiceはできます.つまり、注射したい相手はまだ誰に注射するか分かりません.実行時にしか得られないこのインターフェースの実現であり、これは注射に依存する柔軟性、ダイナミックショットを大幅に向上させた.
既存のフレームとの統合度
1, 高さ、多くの既存の優れたフレーム(例えば、struts 1.xなど)はspringのインテグレーション入口を提供しており、springは注入だけに依存していない.2, SpringはHibernateなどの集積も提供しており、開発の難しさを大幅に簡略化することができます.3, orm、rmi、webserviceなどのインターフェースを提供することが多く、システムが膨大です.
1は既存のフレームと統合できますが、効率の高いDIだけで、springの位置を変えるのはちょっと難しいです.
複雑度の設定
xmlにおけるクラスとクラスの関係は、難易度が低いです.
コードクラスのポジショニングクラスとクラスの関係は、少し難しいです.
また、斧の例を借りれば、springとguiceの違いを見れば、次の人(java対象、调节者)には斧が必要です.(1)原始社会の時は、労働社会はほとんど分業していません.斧が必要な人は自分で斧を磨くしかありません.一人一人が自分の斧を持っています.みんなの石斧を鉄の斧に変えるなら、一人一人が鉄の斧を磨く技術を身につけなければなりません.Javaの場合に対応して、Javaプログラム内のコーディネーターnewの一例が挙げられます.クラス結合度が極めて高く、修正保守が煩雑で、効率が極めて低い.(2)工業社会の時に、工場が現れて、斧はもう普通の人に完成されなくなり、工場で生産され、人々が斧を必要とする時に、工場で斧を買うことができます.斧はどのように作られたのかに関心を持たなくてもいいです.もし鉄の斧を廃棄したら、鋼の斧になります.労働者たちはどんな斧を使うべきですか? 対応するJavaの場合、Javaプログラムの調達者は簡単な工場から调节者を創建して、変化点は簡単な工場に隔離されました.結合度が低いですが、调节者は工場と結合して、自分の工場を置く必要があります.(3)近代工業社会、工場が盛んに発展して、人々はどんな斧を必要としますか?ただ一つの斧の図形を提供するだけで、商店はあなたの提供する図形によってあなたの斧を作って、家まで送ります.Javaの状況に対応して:springの依存注入(4)は必要に応じて社会を分配し、情報は現代化し、人々は工場に行かずに斧を買う.どのような斧が必要なのかに拘らず、事前にどんなパターンを描いたらいいのか、電話をかけるだけで、どんなタイプの斧が必要なのかを説明する.事業者は市場部品の価格によって、最適な製造技術を計算して、最適な斧を作って送ってきます.もっと情報化して、もっと人間化します. Javaの場合に対応して:説明に基づく注入、動的、柔軟で簡単な注入、例えばGuice. Guiceを使うべきではないと思います.多くのフォーラムのように、Javaを勉強しますか?それとも勉強しますか?netを使いますか?それともeclipseを使いますか?それともJbuilderのようなつまらない話題で、プロジェクトの需要を満たします.
ここでれんがを投げて玉を引いて、みんなは異議がある地方は私と討論することを歓迎します.
コードのダウンロード先:http://www.zuidaima.com/share/1759689106541568.htm
注入に依存して、DI(Dependency Injection)はもちろん、DI容器、例えばspring、ピココンタイナー、EJB容器など、最近、googleがより軽いDI容器を誕生しました.Guice!余計なことを言わないで、まずGuiceがどのように注入を実現するかを見てみましょう.簡単なサービスインターフェースとその実現を定義しましょう.
package com.zuidaima.demo.guice;
public interface MyService ... {
void myMethod();
}
package com.zuidaima.demo.guice;
public class MyServiceImpl implements MyService ... {
public void myMethod() ...{
System.out.println("Hello,World!");
}
}
以上は最も普通のインターフェースとその実現で、言うことは何もありません.テストクラスを定義します.このクラスにはserviceオブジェクトの一つの参照が含まれています.このオブジェクトにはGuiceを注入する必要があります.package com.zuidaima.demo.guice;
import com.google.inject.Inject;
public class Client ... {
MyService service;
@Inject // , service ,
void setService(MyService service) ...{ //
this.service=service;
}
public void myMethod() ...{
service.myMethod();
}
}
ここで@Injectを追加した以外、Springとの配置には何の違いもありません.@Injectは容器に対して、ここのserviceは注射が必要です.運行する時、容器は実例を持ってserviceに注射します.GuiceのModuleファイルを定義し、容器に注入する方法を教えます.
package com.zuidaima.demo.guice;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;
public class MyModule implements Module ... {
public void configure(Binder binder) ...{ binder.bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON);
// : MyServiceImpl MyService , 。
}
}
試験クラスの作成package com.zuidaima.demo.guice;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Test ... {
public static void main(String[] args) ...{
MyModule module=new MyModule();//
Injector injector=Guice.createInjector(module);// ,
Client client=new Client();
injector.injectMembers(client);// bean, , client
client.myMethod();
}
}
テストクラスを実行して、コンソール出力:ハロー、ワールド!注入プロセスを完了するGuiceには他にどのような使用特性がありますか?1,MyService定義の対象を確定するためにMyServiceImplとして注射されます.他の実装ではなく、MyServiceインターフェースに@ImplementendBy(MyServiceImpl.class)を追加することができます.
package com.zuidaima.demo.guice;
import com.google.inject.ImplementedBy;
@ImplementedBy(MyServiceImpl. class )
//
public interface MyService ... {
void myMethod();
}
これなら、MyModuleのconfigureメソッドには何も入れなくてもいいです.容器は自動的にMyServiceImplオブジェクトに注射されます.2,Fieldに対して注釈式でCient.javaに注入してもいいです.これを@InjectとMyServiceに表記してもいいです. サービスの前に、例えば:@Inject MyService service;
3、カスタムAnnotationの表示が使用できます.
package com.zuidaima.demo.guice;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.google.inject.BindingAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target( ... { ElementType.FIELD, ElementType.PARAMETER })
@BindingAnnotation
public @ interface MyInterface ... {
}
では、Client.javaはpackage com.zuidaima.demo.guice;
import com.google.inject.Inject;
public class Client ... {
@Inject @MyInterface MyService service;
void setService(MyService service) ...{ //
this.service=service;
}
public void myMethod() ...{
service.myMethod();
}
}
MyModule.javaにおけるconfigure方法の内容は、次のように変更する必要があります.binder.bind(MyService.class).annotatedWith(MyInterface.class).to( MyServiceImpl.class).in(Scoopes.SINGLETON)MyInterfaceと表示されているMyService定義の対象に対して注入するという意味です.
Annotationの表示を行うメンバー(Field、method、argmentなど)は、この属性を持っており、実行可能であり、これらのメンバーの属性によって、いくつかの異なることを行う.例えば、springのAsppectJ、xdocletなど.
下は私が比較してみました.
GuiceとSpringの対比
Spring
Guice
XMLを使う
クラスとクラスの関係をxmlに分離し、呼び出されたオブジェクトの注入を容器が担当するので、依存注入といいます.
xmlを使用しないで、クラスとクラスの関係をModuleに分離して、名声はどこに注入する必要がありますか?
Annotationを使う
ユーザー定義のAnnotation表示をサポートするために、同じインターフェース定義のオブジェクト参照に対して、それぞれのユーザー定義のAnnotationコメントを表示すると、同じクラスの中の同じインターフェースの参照に達することができます.異なる実装に注射します.Moduleでは、表記で区別して、柔軟性が大幅に増加します.Annotationを使うのもいいこととは限らないです.范型などの新特性もいいこととは限らないです.今はほとんどのサーバーがjdk 1.5をサポートしていません.wlsは9以前からサポートしていますが、今のお客様は価格の原因でwls 9を選択することが少ないです.少なくとも私達がやったプロジェクトの中には全部ありません.機能がもっと強くて、お客さんが必要ではないです.どう使いますか?
運転効率
springプロファイルを読み込むには、解析xmlが必要で、効率が低く、getBenも効率が高くないが、使用環境はgetBenには及ばず、生産環境の時のみgetBenを使用し、springアプリケーションを搭載する時には、注射は全部完了しているので、この低効率の問題は問題ではない.
Annotationを使って、cglibは、効率がよくスプリングと一番明らかな違いがあります.springはspringプロファイルを搭載する時に注入したところを全部注入しました.Guiceは使用する時に注射します.運行効率と柔軟性が高いです.
結合結合
結合度が低く、クラスが侵入しないことを強調し、外部化された方式で依存関係を処理します.クラスの中はとても清潔で、配置ファイルの中で文章を作ります.クラスに対する依存性は極めて低いです.
高、コードレベルの表示、DIマーク@injectがコードに侵入して、クラスレベルに結合して、侵入するどころか、まるで侵略的で、コードが多すぎるguiceを結合したものは、注入に依存する初心を大きく逸脱しました.コードの維持性に対して、読み取り可能性はすべて不利です.
クラス作成時
xmlを作成し、ビーンを配置し、注入を配置する必要があります.
声明を@injectとするだけで、注入されるのを待って、最終的には統一されたModuleに注入方式を宣言します.
IOCのみ対応
いいえ、スプリングは今多くの部分を渉猟しました.
はい、今はDI容器だけです.
コード再構成が容易かどうか
統一されたxml配置の入り口は、変更が容易です.
設定作業はModuleで行います.spring異曲と同じです.
複数の注入方式に対応
コンストラクタ,setter方法
Field,コンストラクタ,setter方法
融通性
1,同じインターフェース定義の引用は異なる実装を注入する必要がある場合、異なるModuleを作成します.煩わしいです.2、ダイナミック注入をしたいなら、注射の一つの実現はまだ分かりません.どうすればいいですか?springは仕方がないです.事前に配置ファイルに書いてください.Guiceはできます.つまり、注射したい相手はまだ誰に注射するか分かりません.実行時にしか得られないこのインターフェースの実現であり、これは注射に依存する柔軟性、ダイナミックショットを大幅に向上させた.
既存のフレームとの統合度
1, 高さ、多くの既存の優れたフレーム(例えば、struts 1.xなど)はspringのインテグレーション入口を提供しており、springは注入だけに依存していない.2, SpringはHibernateなどの集積も提供しており、開発の難しさを大幅に簡略化することができます.3, orm、rmi、webserviceなどのインターフェースを提供することが多く、システムが膨大です.
1は既存のフレームと統合できますが、効率の高いDIだけで、springの位置を変えるのはちょっと難しいです.
複雑度の設定
xmlにおけるクラスとクラスの関係は、難易度が低いです.
コードクラスのポジショニングクラスとクラスの関係は、少し難しいです.
また、斧の例を借りれば、springとguiceの違いを見れば、次の人(java対象、调节者)には斧が必要です.(1)原始社会の時は、労働社会はほとんど分業していません.斧が必要な人は自分で斧を磨くしかありません.一人一人が自分の斧を持っています.みんなの石斧を鉄の斧に変えるなら、一人一人が鉄の斧を磨く技術を身につけなければなりません.Javaの場合に対応して、Javaプログラム内のコーディネーターnewの一例が挙げられます.クラス結合度が極めて高く、修正保守が煩雑で、効率が極めて低い.(2)工業社会の時に、工場が現れて、斧はもう普通の人に完成されなくなり、工場で生産され、人々が斧を必要とする時に、工場で斧を買うことができます.斧はどのように作られたのかに関心を持たなくてもいいです.もし鉄の斧を廃棄したら、鋼の斧になります.労働者たちはどんな斧を使うべきですか? 対応するJavaの場合、Javaプログラムの調達者は簡単な工場から调节者を創建して、変化点は簡単な工場に隔離されました.結合度が低いですが、调节者は工場と結合して、自分の工場を置く必要があります.(3)近代工業社会、工場が盛んに発展して、人々はどんな斧を必要としますか?ただ一つの斧の図形を提供するだけで、商店はあなたの提供する図形によってあなたの斧を作って、家まで送ります.Javaの状況に対応して:springの依存注入(4)は必要に応じて社会を分配し、情報は現代化し、人々は工場に行かずに斧を買う.どのような斧が必要なのかに拘らず、事前にどんなパターンを描いたらいいのか、電話をかけるだけで、どんなタイプの斧が必要なのかを説明する.事業者は市場部品の価格によって、最適な製造技術を計算して、最適な斧を作って送ってきます.もっと情報化して、もっと人間化します. Javaの場合に対応して:説明に基づく注入、動的、柔軟で簡単な注入、例えばGuice. Guiceを使うべきではないと思います.多くのフォーラムのように、Javaを勉強しますか?それとも勉強しますか?netを使いますか?それともeclipseを使いますか?それともJbuilderのようなつまらない話題で、プロジェクトの需要を満たします.
ここでれんがを投げて玉を引いて、みんなは異議がある地方は私と討論することを歓迎します.