17

@Autowired注釈とnewキーを使用した場合の違いは何ですか?クラス内で、次の違いは何でしょうか。

@Autowired private UserDao userdao;

private UserDao userDao = new UserDaoImpl();

パフォーマンスに影響はありますか?

4

4 に答える 4

21

他の人がすでに触れている低結合度に加えて、大きな違いは、このnewアプローチでは、必要かどうかに関係なく、毎回新しいオブジェクトを取得することです。再利用可能UserDaoImplで、ステートレスで、スレッドセーフ(DAOクラスが目指すべきもの)であっても、必要なすべての場所でそれらの新しいインスタンスを作成できます。

これは最初は大きな問題ではないかもしれませんが、オブジェクトグラフが大きくなるにつれて、UserDaoImplおそらくHibernateセッションが必要であり、データソースが必要であり、JDBC接続が必要であると考えてください。オブジェクトはすぐに作成および初期化する必要のある多くのオブジェクトになります。何度も何度も。コードに依存する場合new、初期化ロジックを多数の場所に分散させることにもなります。この例のように、適切なパラメーターを使用してJDBC接続を開くには、UserDaoImplにコードを含める必要がありますが、他のすべてのDAOクラスも同じことを行う必要があります。

そして、ここで制御の反転(IoC)が登場します。これは、オブジェクトの作成とライフサイクルをオブジェクトのバインドと使用から切り離すことにより、これらの問題に対処することを目的としています。IoCの最も基本的なアプリケーションは、単純なFactoryクラスです。より洗練されたアプローチは、Springなどの依存性注入です。

パフォーマンスに影響はありますか?

はい。ただし、それほど重要ではない可能性があります。Springsの依存性注入を使用すると、コンテナーを初期化してすべての管理対象オブジェクトをセットアップする必要があるため、起動時に少しコストがかかります。ただし、管理対象オブジェクトの新しいインスタンスを作成することはないため(これを設計する方法であると想定)、GCの負荷を減らし、オブジェクトの作成を減らすことで、実行時のパフォーマンスを向上させることができます。

ただし、大きなメリットは、アプリケーションの保守性と堅牢性にあります。

于 2012-10-12T08:12:31.677 に答える
7

上記のコメントは正しいですが、ここであなたに役立ついくつかの例を追加します。

クラスを使用する100のクラスがあり、次のUserDaoようなdaoインスタンスを取得します private UserDao userDao = new UserDaoImpl();。100か所で

数週間後、要件が変更され、使用する必要がありますLdapUserDao

class LdapUserDao implements UserDao{

}

を実装しUserDaoます。職業はなんですか?キーワードをどのように処理しますかnew。implクラスを使用法に結び付けました。

@Autowiredを100か所で使用する場合は1か所から(xmlベースの構成を使用する場合はxmlに移動し、xmlから別のUserDaoに切り替えます。アノテーションを付ける場合は、そのコンポーネントに移動し、Springアノテーションを適切なコンポーネントに切り替えます)管理します。したがって、100か所に表示されます。これがいわゆるDIパターンです。これがDIの目的です

もう1つの重要なことは、オブジェクトスコープを管理できる場合でも、Springアノテーションを使用することですが、新しいキーワードを使用すると(ダムシングルトンなどを実行しない限り)、新しいキーワードを使用することはできません。

  Prototype
  Request
  Single

スコープオブジェクト

パフォーマンスの面では、コードが表示されない限り、言うのは非常に困難です。しかし、最悪の場合、それらは同等のパフォーマンスを発揮する可能性があります。そうでない場合、スプリングの方法は高速です。なぜなら、daoクラスはプロトタイプではなくシングルトンである必要があるため、プロジェクト全体で、春の方法でuserdaoオブジェクトを使用することになりnewます。 daoオブジェクトへの参照を失っています。しかし、パフォーマンスを残します。優れた設計よりもパフォーマンスを考慮しないでください。常に最初に良い方法で(速い方法ではなく)それを良いデザインで作り、それからそれのパフォーマンスを見てください。

于 2012-10-12T02:08:25.250 に答える
3

使用するとNullPointerExceptionが発生します

private UserDao userDao = new UserDaoImpl();

*context.xmlで宣言されたセッション参照を設定しないためです。

于 2015-12-01T07:59:46.077 に答える
1

実行時に、どちらの場合も属性にUserDaoImpl割り当てられたインスタンスを取得します。userdao

ただし、最初のアプローチは、依存性注入パターンの使用を意味します。これには、2番目のアプローチに比べていくつかの利点があります。

  • クラスはインターフェイスに依存するようになったため、UserDaoの任意の実装(おそらく、RDBMSを使用する実装、XMLファイルをリポジトリとして使用する実装)で機能します。
  • 今はインターフェースに依存しているので、ユニットテストとモックは非常に簡単で簡単です。
  • 低結合は、コードに含めるのに適した属性です。

したがって、特にすでにSpringを使用している場合は、最初のアプローチよりも2番目のアプローチを選択する必要があります(これが制御の反転コンテナの背後にある考え方です)

于 2012-10-12T01:05:23.257 に答える