@Autowired
注釈とnew
キーを使用した場合の違いは何ですか?クラス内で、次の違いは何でしょうか。
@Autowired private UserDao userdao;
と
private UserDao userDao = new UserDaoImpl();
パフォーマンスに影響はありますか?
@Autowired
注釈とnew
キーを使用した場合の違いは何ですか?クラス内で、次の違いは何でしょうか。
@Autowired private UserDao userdao;
と
private UserDao userDao = new UserDaoImpl();
パフォーマンスに影響はありますか?
他の人がすでに触れている低結合度に加えて、大きな違いは、このnew
アプローチでは、必要かどうかに関係なく、毎回新しいオブジェクトを取得することです。再利用可能UserDaoImpl
で、ステートレスで、スレッドセーフ(DAOクラスが目指すべきもの)であっても、必要なすべての場所でそれらの新しいインスタンスを作成できます。
これは最初は大きな問題ではないかもしれませんが、オブジェクトグラフが大きくなるにつれて、UserDaoImpl
おそらくHibernateセッションが必要であり、データソースが必要であり、JDBC接続が必要であると考えてください。オブジェクトはすぐに作成および初期化する必要のある多くのオブジェクトになります。何度も何度も。コードに依存する場合new
、初期化ロジックを多数の場所に分散させることにもなります。この例のように、適切なパラメーターを使用してJDBC接続を開くには、UserDaoImplにコードを含める必要がありますが、他のすべてのDAOクラスも同じことを行う必要があります。
そして、ここで制御の反転(IoC)が登場します。これは、オブジェクトの作成とライフサイクルをオブジェクトのバインドと使用から切り離すことにより、これらの問題に対処することを目的としています。IoCの最も基本的なアプリケーションは、単純なFactoryクラスです。より洗練されたアプローチは、Springなどの依存性注入です。
パフォーマンスに影響はありますか?
はい。ただし、それほど重要ではない可能性があります。Springsの依存性注入を使用すると、コンテナーを初期化してすべての管理対象オブジェクトをセットアップする必要があるため、起動時に少しコストがかかります。ただし、管理対象オブジェクトの新しいインスタンスを作成することはないため(これを設計する方法であると想定)、GCの負荷を減らし、オブジェクトの作成を減らすことで、実行時のパフォーマンスを向上させることができます。
ただし、大きなメリットは、アプリケーションの保守性と堅牢性にあります。
上記のコメントは正しいですが、ここであなたに役立ついくつかの例を追加します。
クラスを使用する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オブジェクトへの参照を失っています。しかし、パフォーマンスを残します。優れた設計よりもパフォーマンスを考慮しないでください。常に最初に良い方法で(速い方法ではなく)それを良いデザインで作り、それからそれのパフォーマンスを見てください。
使用するとNullPointerExceptionが発生します
private UserDao userDao = new UserDaoImpl();
*context.xmlで宣言されたセッション参照を設定しないためです。
実行時に、どちらの場合も属性にUserDaoImpl
割り当てられたインスタンスを取得します。userdao
ただし、最初のアプローチは、依存性注入パターンの使用を意味します。これには、2番目のアプローチに比べていくつかの利点があります。
したがって、特にすでにSpringを使用している場合は、最初のアプローチよりも2番目のアプローチを選択する必要があります(これが制御の反転コンテナの背後にある考え方です)