7

私のピアは、オブジェクトの新しいインスタンスを作成するために常にSpringを使用するように強制します。私の理解では、Spring はビジネス オブジェクトをより効率的に管理するためのプラットフォームを提供します。Spring により、アーキテクチャはよりモジュール化され、より柔軟になります。

Spring Bean を使用しないと感じ、新しいオブジェクトを作成する一般的な方法を使用する場合がいくつかあります。しかし、私の同僚は常にパフォーマンスの向上を言い訳にしてそれを強制します。パフォーマンスの要因が言及されている春に関連する記事は見つかりません。

質問 : オブジェクトの作成に Spring Bean を使用している場合、「new」演算子を使用して新しいインスタンスを作成する場合と比較してパフォーマンスが向上するかどうか。

4

6 に答える 6

21

Spring は他のツールと同様に、適切に適用するとメリットがあります。不適切に適用された場合、それは純粋なオーバーヘッドにすぎません。

これは、Spring で常に目にする一般的な出来事です。プロジェクトでは、すべてが Spring Bean でなければならないと規定されています。これにより、何か単純なことをしようとすると、開発成果物に関して大量のオーバーヘッドが発生します。

Spring を使用する多くのアプリケーションで見落とされている重要なポイントは、デザイナー/アーキテクト側のオブジェクト指向の経験や知識の一般的な欠如に関係しています。彼らはSpringに慣れているので、すべてがSpringでなければなりません。この状況は、多くの場合、アプリケーションの全体的なクラス階層を確認することで特定できます (できれば、Spring Bean を理解する UML ツールを知りません)。通常、ほとんどフラットな継承階層が見られますが、継承階層はほとんどありません。クラスは基本クラスから機能を継承します。これは、カプセル化がほとんどまたはまったくないことを意味します。これは、ソリューション内の異常な数のクラスとして現れる順番です。最後に、私が見たほとんどの場合、この方法で Spring を使用するアプリケーションにもパフォーマンスの問題があります。Spring を使用しているからではなく、しかし、より包括的な設計の欠如によるものです。Spring はフレームワークであり、アーキテクチャではありません。

Spring が意味を持つ唯一の領域は、頻繁に変更される可能性が高いクラス、または実行環境に結び付けられているクラス (つまり、テストと本番環境) です。それらの領域以外に、問題のドメイン (現実) に存在するクラス間の関係もコードに存在する必要があります。これらは変更されず、Spring Bean にすることで、パフォーマンスと開発成果物の面でオーバーヘッドが増えるだけです。

アプリケーションが適切に設計されている場合 (ほとんどの場合、適切に設計されていない場合)、ライブラリまたはフレームワークは常に、問題のドメイン内のクラスによってカプセル化されます。これは特に、ライブラリまたはフレームワークがアプリケーション レベルで目に見えるコンポーネントではないことを意味します。これは、OOA/OOD の感覚を持つ人なら誰でも明らかなはずです。ビジネスの世界で、クラス間の関係を外部から構成する機能を正式に含む 1 つの問題ドメインを考えてみてください。はいと答えた場合、あなたは OOA/OOD を理解していないことになり、どこでも Spring を使用していることになります。

これは、Spring を使いすぎていないか、誤って使用していないかを確認するためのリトマス試験紙です。理論的には、コードを変更することなく、Spring を同等のものと交換できますか? そうでない場合は、設計が弱く、Spring でそれを支えています。これは、アプリケーションをリリースするたびに責任が増大する (ワークロードが増大する) 場合に最もよく識別できます。

最後に、誰かが「Spring はテストを容易にする」という主張でここに声を掛けるでしょう。これはほとんどの場合に当てはまります。ほとんどの場合は、設計が不十分なアプリケーションの一部です。Spring で構築されたアプリケーションよりも簡単にテストできる唯一のものは、適切に設計されたオブジェクト指向アーキテクチャーで構築されたアプリケーションです。

于 2013-09-16T17:48:26.220 に答える
6

合理的に考えると、どのように春が速くなるでしょうか? コードのラッパーです。また、適用可能なデフォルトのコンストラクター/オーバーロードされたコンストラクターも通過します。

例 import demo.dependency.injection.IAccount;

public class SavingAccount implements IAccount {
public static int SAVING_INT = 5;

public SavingAccount() {
    System.out.println("Default constructor invoked!!");
}

@Override
public int calculateInterest(int amount, int duration) {
    return (amount*duration*SAVING_INT)/100;
}

}

Bean 構成:

<!-- Fixed Account -->
<bean id="FixedAccount" class="demo.dependency.injection.impl.FixedAccount">
</bean>

アプリケーションコンテキストを使用して Bean をロードすると、出力されます

ApplicationContext context = new FileSystemXmlApplicationContext("/Beans/SpringDemo.xml");
Account myAccount = (Account)context.getBean("FixedAccount");


Default constructor invoked!!

ただし、ここでは、パフォーマンス以外にも利点があることを理解する必要があります。好き - DI - 管理性

したがって、パフォーマンスの理由は正当化できないと思います。

それとは別に、Spring IOC フレームワークは、Spring Bean 構成を使用してインスタンスを作成する方法を提供します。ただし、 new 演算子を使用してインスタンスを作成することを止めるわけではありません。

spring Beanの代わりにnewを使用することを選択した例を挙げたいと思います。

Web アプリケーションで、ビジネス ロジック用に異なるメソッドを持つシングルトン Bean があり、各操作で操作用の新しいオブジェクト インスタンスが必要になる場合があります (メソッド レベルの変数はスレッド セーフです)。

シングルトン Bean にプロトタイプ Bean がある場合、シングルトン Bean が呼び出されたときに 1 回だけ呼び出されるためです。完全に理解するために、これを実行してください。

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html

于 2012-04-16T07:20:37.497 に答える
5

唯一のパフォーマンスヒット(小さいか大きいか) は、Spring のアプリケーション コンテキストの最初の解釈によって速度が低下する可能性がある起動時だと思います。しかしその後、Spring にはすべてのメタデータが手元にあるため、標準的なケースでは測定可能なオーバーヘッドになるはずです。

そのため、通常は起動時のパフォーマンスも重要なデスクトップで使用している場合、大規模で複雑なアプリケーションで知覚されるパフォーマンスに影響を与える可能性があります。サーバー側アプリケーションでは、起動はそれほど重要ではなく、アプリケーションが負荷の下でどのように動作するかの方が重要であるため、ほとんど無視できます。

Spring と非 Spring の他の唯一の違いは、Spring がメタデータと AOP を作成してメモリにキャッシュする必要があるため、デフォルトのメモリ消費に部分的な影響を与えることです。

于 2012-04-16T07:18:15.683 に答える
4

Spring フレームワークは、Bean を作成するパフォーマンスを向上させるためのものではなく、アプリケーションを疎結合にするためのものです。依存性注入と制御の反転を使用してそれを実現します。

に何ができるかを説明する記事をいくつか紹介します。

  1. http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html
  2. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/overview.html
  3. http://orangeslate.com/2006/11/10/five-advantages-of-spring-framework/

オブジェクトの作成にSpring Beanを使用している場合、「new」演算子を使用して新しいインスタンスを作成する場合と比較してパフォーマンスが向上するかどうか。

通常はありません。Spring でさえ、Bean を作成するためにコンストラクターまたはリフレクションのいずれかが必要です。デフォルトでは、Spring Bean はシングルトンであるため、一度だけ作成されます。そのため、2 回目にアクセスする方が速い場合があります。ただし、それだけで春を使用していないことを確認してください。

于 2012-04-16T08:06:02.750 に答える
2

春を使用している間、生のパフォーマンスはアプリを作成するときに頭に浮かぶものではありません。それは、コードが成長するにつれての保守性です。したがって、ファクトリメソッドを使用してオブジェクトをインスタンス化することをお勧めします。これにより、ビジネスコードを実行するためのオブジェクトの作成と保守の負担から解放されます。 IOCは春の中心的な信条であり、ユーザーの関与なしにオブジェクトを作成するのに役立ちます。アーティルのベストプラクティスについては、このブログ投稿をご覧ください。

于 2012-04-16T07:13:18.580 に答える
0

Spring を使用して Bean を作成することは、オブジェクトを適切に管理することです。Bean を使用することで、IOC (Inversion of Control) および AOP サポートを使用できます。

new または spring を使用して新しいオブジェクトを作成することは同じです (パフォーマンスの問題はないと思いますが、spring を使用すると、後でより整理され、柔軟になります。)

もう1つ、SpringはSingletonやfactory-methodなどの様々なデザインパターンもサポートしています。

于 2012-04-16T07:08:26.763 に答える