web-dev-qa-db-ja.com

Spring Beanを静的として宣言することは、設計上の選択として不適切ですか?

質問はかなり単純明快です。なぜ説明が必要なのかを説明しようと思います。

(これはすべて、私の1½年後輩ですJava開発者の意見、これは不完全かもしれません。それが私がそこで質問している理由です)

  • 一部のクラスには他のクラスが必要になるなど、クラス間の結合が強化されます。静的Beanがあると、属性に干渉することなく、いつでも好きなときに呼び出すことができます。ユーティリティメソッドを呼び出すようなものですが、他の場所に記述されています。
  • 管理が必要なレガシープロジェクトにXML指向の構成がある場合は特に、管理が悪夢になることがあります。
  • クラスでより多くの依存関係が必要な場合(私は26個の属性のようなかわいいものをいくつかに切り詰めようとします)、それをより小さなクラスに切り詰める必要がありますが、それらのクラスにはまだ多くのBeanが必要な場合があります機能するように、もう一度削減します。それはシーンに多くの複雑さをもたらします。

私は70kに近いLOC Java=プロジェクトに取り組んでいます。これは、この分野での初めての経験です。このWebアプリケーションのデザインを改善しようとしているのですが、 Java Springを使用したBeansの重要なポイント).

したがって、問題は次のとおりです:Beanに静的クラスを使用することは悪い考え/悪いデザインですか?良いものは何ですか?

おまけの質問:Spring Beanアプリケーションをエレガントに(エレガントに)分解する方法に関するアドバイス

ありがとうございました


PS:私はすでに この関連する質問 について読みました。これは、クラス/ Beanの状態とそれを回避する方法について、Beanの静的性よりも悪い/良い設計としてより多くを扱います。


[〜#〜]編集[〜#〜]

(遅延のため申し訳ありませんが、コードを投稿できませんでした)以下は、何が見つかり、この質問について私に何を考えさせたのかの例です。

// Bean managed in a spring-context.xml
public class HugeMapper  {

    @Autowired
    // Used here only
    private MapperBean    mapperBean;

    @Autowired
    // Used here only
    private ServiceBean   serviceBean;

    @Autowired
    // Used in a couple of classes
    private UtilitaryBean utilitaryBean;

    @Autowired
    // Used in a couple of beans
    private UsefulBean    usefulBean;

    @Autowired
    // Used in nearly half the components
    private OverusedBean  overUsedBean;

    // Code treatment ...
}

問題は、さまざまな場所で使用されている豆についてです。それらを静的にすることで依存関係は削除されますが、結果がどうなるか、そしてそれが良い/悪い設計であるかどうかはわかりません。

5
Yassine Badache

静的は多くの理由で良い考えではありません:

  • それらは harder であり、単体テストでモックを作成します
  • 永続的なメモリ消費¹
  • Is 手続き型
  • そして、他のいくつかの 欠点

上記のほとんどすべての欠点は、静的なSpring Beanが悪い考えである理由を説明するためにも使用できます。

一部のクラスには他のクラスが必要になるなど、クラス間の結合が強化されます。静的Beanがあると、属性に干渉することなく、いつでも好きなときに呼び出すことができます。ユーティリティメソッドを呼び出すようなものですが、他の場所に記述されています。

私が正しく理解している場合(一部のコードは表示されていません)、このようにして、クラスの真の複雑さを隠しています。これは、Service Locatorパターンを思い出します(Singletonのような anti-patternDemeterの法則を破る 、そして hide 依存関係)。クラスの依存関係で本当に悪いことが起こっているときによりよく公開され、それらを単体テストするのが簡単なので、クラスの依存関係を公開することは良いことです。

管理が必要なレガシープロジェクトにXML指向の構成がある場合は特に、管理が悪夢になることがあります。

これが、今日注釈を付ける理由です:)

クラスでより多くの依存関係が必要な場合(私は26個の属性のようなかわいいものをいくつかに切り詰めようとします)、それをより小さなクラスに切り詰める必要がありますが、それらのクラスにはまだ多くのBeanが必要な場合があります機能するように、もう一度削減します。それはシーンに多くの複雑さをもたらします。

大きくて複雑なコードを少しずつ壊すと、複雑さが増すとは思いません。それがあなたのケースで複雑さを増しているなら、あなたはこれを間違っています:)。 [〜#〜] srp [〜#〜] について読むことをお勧めします

おまけの質問:Spring Beanアプリケーションをエレガントに(エレガントに)分解する方法についてのアドバイスはありますか?

Spring Beanを使用するための優れたアプローチについて説明します ここ 。一般に、最善の方法は、Spring Beanコンストラクターを使用して依存関係を注入することです。

¹。 Spring Beanはデフォルトではシングルトンであるため、実際には問題ありません。

8
Dherik