質問

Springによって接続されるクラスで @Autowired を使用することの長所と短所は何ですか?

明確にするために、XMLでの自動配線ではなく、 @Autowired アノテーションについて具体的に説明しています。

おそらく理解できないかもしれませんが、私にとってはアンチパターンのように思えます-あなたのクラスは、POJOであるだけでなく、DIフレームワークに関連付けられていることに気付き始めます。たぶん私は罰のための食いしん坊ですが、私は豆のための外部XML構成を持つのが好きで、明示的な配線が好きなので、どこに何が配線されているかを正確に知っています。

役に立ちましたか?

解決

長い間、<!> quot;集中型、宣言型、構成<!> quot;を持つことには価値があると信じていました。私たち全員が使用していたxmlファイルのように。それから、ファイル内のほとんどの要素が構成ではないことに気付きました-開発後、どこでも変更されることはありませんでした。その後、<!> quot; centralized <!> quot;非常に小さなシステムでのみ価値があります-小規模なシステムでのみ、構成ファイルを全体として編集できます。そして、本当に同じ<!> quot; wirings <!> quot;ほとんどがコードの依存関係によって複製されていますか?そのため、私が保持しているのはメタデータ(注釈)だけです。これは、まだ一種の宣言です。これらは実行時に変更されず、決して <!> quot;構成<!> quot;誰かがその場で変更するデータ-だからコード内に保持するのはいいと思う。

可能な限り完全自動配線を使用しています。大好きです。銃口で脅かされない限り、私は古いスタイルの春には戻りません。完全に@Autowiredを好む私の理由は時間とともに変化しました。

今、自動配線を使用する最も重要な理由は、システムで追跡する抽象化が1つ少ないことです。 <!> quot; bean name <!> quot;事実上なくなりました。 Bean名はxmlのためにのみ存在することがわかります。したがって、抽象インダイレクションの完全な層(Bean名<!> quot; foo <!> quot;をBean <!> quot; bar <!> quot;にワイヤリングする場所)はなくなりました。 <!> quot; Foo <!> quot;を配線します。 Beanに直接接続し、実行時プロファイルによって実装を選択します。これにより、依存関係と実装をトレースするときにコードを操作できます。コードに自動配線された依存関係が表示されたら、<!> quot; go to implementation <!> quot;を押すだけです。私のIDEで重要なのは、既知の実装のリストです。ほとんどの場合、実装は1つだけであり、私はクラスに直接入ります。それよりもずっと単純なことはできず、どの実装が使用されているかを常に正確に知っています(XML配線では反対の方が真実に近いと主張しています-面白い視点の変化!)

これは非常に単純な層であると言えますが、システムに追加する抽象化の各層は複雑さを増します。 xmlがこれまでに使用したシステムに実際の価値を追加したとは本当に思わない。

これまで使用したほとんどのシステムでは、実稼働ランタイム環境の構成が 1 しかありません。他にもテスト用の構成などがあります。

完全な自動配線は春のレール上のルビーであると言えます。これは、ほとんどのユースケースが従う通常の一般的な使用パターンがあるという概念を包含しています。 XML構成を使用すると、意図した場合とそうでない場合がある、一貫性のある/一貫性のない多くの構成の使用を許可できます。私は非常に多くのxml構成が一貫性のない状態で行き過ぎているのを見ました-コードとともにリファクタリングされますか?とは思いませんでした。これらのバリエーションは理由がありますか?通常はありません。

設定では修飾子をほとんど使用せず、これらの状況を解決する他の方法を見つけました。これは明らかな<!> quot;短所<!> quot;遭遇する:自動配線とよりスムーズに対話できるようにコーディング方法をわずかに変更しました:顧客リポジトリはもはや汎用Repository<Customer>インターフェースを実装しませんが、CustomerRepositoryを拡張するインターフェース@Componentを作成します。サブクラス化に関しては、1つまたは2つのトリックもあります。しかし、それは通常、より強い型付けの方向に私たちを向けるだけで、それは私がほとんど常により良い解決策だと思います。

しかし、はい、あなたは主に春が行う特定のスタイルのDIに結びついています。依存関係の公開セッターを作成することもありません(カプセル化/情報隠蔽部門で+1であると主張できます)システムにはまだxmlがありますが、xmlは基本的にのみにはanoが含まれますmal病。完全自動配線は、xmlとうまく統合されます。

今必要なのは、java.util.concurrent、<=>、および残りをJSRに含めることです( JSR-250 )ので、春と結び付ける必要はありません。これが過去に起こっていた方法です(<=>ものが頭に浮かぶ)ので、これが再び起こっても完全に驚かないでしょう。

他のヒント

ここで私が気に入っている/嫌いなのは、Springと自動配線です。

長所:

  • 自動配線は厄介なXML設定を取り除きます。
  • フィールド、セッターメソッド、またはコンストラクターを使用して直接注入できる注釈の使用がはるかに簡単になりました。また、注入したBeanに注釈を付けて「修飾」することもできます。

短所:

  • 自動配線と注釈を使用すると、Springライブラリに依存するようになり、XML構成と同様に、Springの有無に関係なく実行できます。あなたが言ったように、あなたはDIフレームワークに縛られるようになります。
  • 同時に、Beanを「修飾」できることが好きですが、これはコードを非常に面倒にします。同じBeanを複数の場所に注入する必要がある場合は、同じ文字列名が繰り返し表示されています。私にはこれはエラーの可能性があるようです。

とにかくSpringの統合に非常に依存しているため、依存関係の問題が解決されないため、私は職場でほぼ独占的に自動配線の使用を開始しました。自動配線を広範囲に使用するSpring MVCプロジェクトに取り組みましたが、頭を包むのは少し困難でした。

自動配線は習得済みの味だと思います。慣れると、XML設定よりも強力で簡単で、頭痛が少ないことを実感できます。

大きなプロジェクトでは、@ AutowireからXML構成に戻しています。問題は、ブートストラップのパフォーマンスが非常に低いことです。自動配線スキャナーは、自動配線検索クラスパスからすべてのクラスを読み込むため、Springの初期化中に多くのクラスが積極的に読み込まれます。

環境の切り替えについてはほとんど議論されていません。私が取り組んできたほとんどのプロジェクトは、作業している環境に応じて依存関係を注入するという本当の問題でした。 xml configを使用すると、Spring ELを使用するのは非常に簡単であり、注釈を使用した優れたソリューションはありません。私は1つを見つけました:

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

それは機能するはずですが、良い解決策ではありません。

@Autowireに切り替えました。小さなプロジェクト以外でXML構成を維持することは、それ自体がタスクとなり、理解度は急速に低下しました。

IntelliJは、Springアノテーションの(完全ではない)優れたサポートを提供します。

このテーマに関する私の見解は、特に大規模システムでは、xml構成によりコードの明瞭さが低下するということです。

@Componentのようなアノテーションは事態をさらに悪化させます。デフォルトのコンストラクターを提供する必要があるため、依存関係を最終的にはできないため、開発者はオブジェクトを可変にできます。依存関係は、パブリックセッターを介して注入するか、@ Autowiredを介して制御しないようにする必要があります。 [依存関係のインジェクションは、依存関係をインスタンス化するクラスによってさらに悪化します。これは、新しく作成されたコードでも見られます!]制御されていないということは、大規模なシステムでは、そのタイプの複数の実装(または子)が利用可能な場合、どの実装が@Autowiredであるかを理解するためにより複雑になり、バグの調査をより困難にする複雑さです。また、おそらくテスト環境用とプロダクション用のプロファイルがあるため、プロダクションのバグはテスト環境でバグを見つけることはできませんが、プロダクションでは最も痛いときにのみ発生します。コンパイル時間!

私は構成クラスを宣言する中間地点に固執します(@Configurationを使用したJavaベースのSpring構成)

すべてのBeanを構成クラスで明示的に宣言します。設定クラスで@Autowiredのみを使用します。目的は、Springへの依存を設定クラスに限定することです

@Configurationは特定のパッケージに存在します。これは、スプリングスキャンが実行される唯一の場所です。 (これにより、大規模プロジェクトで開始時間が大幅に短縮されます)

すべてのクラス、特にデータオブジェクト、JPA、Hibernate、Spring、および多くのシリアル化ライブラリを不変にするよう努力しています。私は、セッターを提供することを余儀なくされるもの、またはプロパティ宣言から最終的なキーワードを削除することを余儀なくされるものは一切避けます。

作成後にオブジェクトを変更する可能性を減らすことで、大規模システムのバグを大幅に減らし、バグが存在する場合にバグを見つける時間を短縮します。

また、システムの異なる部分間の相互作用をより良く設計することを開発者に強制するようです。問題やバグはますますコンパイルエラーになり、無駄な時間が減り生産性が向上します。

これまでの経験
長所

  • @Autowireアノテーションを使用するだけで構成が簡単になります
  • セッターメソッドを使用したくないため、クラスはよりクリーンになります

短所

  • DIを使用している場合でも、xmlファイルに密結合します
  • 実装を見つけるのが難しい(ただし、intellijのような適切なIDEを使用している場合は、これを取り除くことができます)

個人的な経験では、テストケースでは@AutoWireアノテーションをあまり使用しませんでした。

XMLではなく、アノテーションを使用して書くのが大好きです。 Springマニュアルと最新バージョンによると、XMLと注釈は同じ結果を達成しました。

これは私のリストです

長所:

  • xmlから無駄な行を削除
  • コードのデバッグを簡素化する:クラスを開くと、クラスにあるものを読むことができます
  • より高速な開発、400行以上のXMLを含むプロジェクトは読み取り可能ですか?

短所:

  • 標準のJava実装ではありませんが、Java標準APIである@Injectを使用するように切り替えることができるため、BeanはPojoのままです
  • 単にどこでも、db connection eを使用することはできませんが、それは単なる意見であり、すべての構成を読み取る場所があることを好みます。

理解するために、@ Autowiredはインターフェイス参照を参照し、そのオーバーライド機能を使用するときに使用するのが最適ですが、これに関する問題は、実行時にnullに割り当てられることがあるということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top