web-dev-qa-db-ja.com

Spring Frameworkは正確には何のためのものですか?

Spring について多くの人が聞いていますが、SpringはWeb開発に適したフレームワークであると人々は皆に言っています。 Spring Frameworkは正確には何のためのものですか?

582
Maksim

基本的にSpringは dependency-injection のフレームワークで、非常に分離されたシステムを構築することを可能にするパターンです。

問題

たとえば、システムのユーザーをリストしてUserListerというインターフェイスを宣言する必要があるとします。

public interface UserLister {
    List<User> getUsers();
}

そしておそらく、すべてのユーザーを取得するためにデータベースにアクセスする実装があります。

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

あなたの見解では、インスタンスにアクセスする必要があるでしょう(単なる例です、覚えておいてください):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

上記のコードは変数userListerを初期化していないことに注意してください。私たちは何をすべき?このようにオブジェクトを明示的にインスタンス化すると、

UserLister userLister = new UserListerDB();

...私はDBにアクセスするクラスの私の実装とビューを結合したいと思います。 DB実装から、コンマ区切りファイルからユーザリストを取得するものに切り替えたい場合はどうしたらいいですか(覚えておいてください、これは例です)。その場合、私は自分のコードに再び行き、最後の行を次のように変更します。

UserLister userLister = new UserListerCommaSeparatedFile();

これは、このような小さなプログラムでは問題ありませんが、...何百ものビューと同様の数のビジネスクラスを持つプログラムではどうなりますか。メンテナンスは悪夢になります!

スプリング(依存性注入)アプローチ

Springが行うことは、XMLファイルまたはアノテーションを使用してクラスをwireすることです。これにより、すべてのオブジェクトがSpringおよびinjectionによってインスタンス化および初期化されます。フレームワーク、ビジネスクラス、DAOなど、など、など。

Springの例に戻ると、userListerフィールドのセッターと、次のようなXMLファイルが必要です。

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

もっと簡単に言うと、ビュークラスのフィールドに@Injectという注釈を付けます。

@Inject
private UserLister userLister;

このようにしてビューが作成されたとき、それはmagicallyが動く準備ができたUserListerを持つことになります。

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

それは素晴らしいです!そうではありませんか?

  • あなたのUserListerインターフェースの別の実装を使いたい場合はどうしますか? XMLを変更するだけです
  • UserLister実装の準備が整っていない場合はどうなりますか?UserListerの一時的モック実装をプログラムし、ビューの開発を容易にする
  • 私がもうSpringを使いたくない場合はどうしますか?それを使わないでください!あなたのアプリケーションはそれに結合されていません。 コントロールの反転 : "アプリケーションはフレームワークを制御しますが、フレームワークはアプリケーションを制御しません"。

Dependency Injectionには他にもいくつかの選択肢があります。私の考えでは、Springをその単純さ、優雅さ、安定性以外に有名にしたのは、SpringSourceの人々がSpringを他の多くの一般的なフレームワークと統合するのに役立つことあなたのアプリケーションに邪魔をする。また、Springには、Spring MVC、Spring WebFlow、Spring Securityなど、いくつかの優れたサブプロジェクトがあります。

お役に立てれば。とにかく、 Martin Fowlerの記事 Dependency InjectionとInversion of Controlについて読んでおくことをお勧めします。 基本を理解したら、 Spring Documentation をご覧ください。、私の意見ではそれ です はかつて 史上最高の春の本でした。

673
victor hugo

Spring containsSkaffmanが正しく指摘したように)MVCフレームワーク。簡単に説明すると、ここに私の意見があります。 Springはサービス層、Web層、ビジネス層の分離をサポートしていますが、実際に最も効果的なのはオブジェクトの「注入」です。例を使って以下の例を考えてください。

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

今すぐあなたのコードでは次のようにRoadTripと呼ばれるクラスがあります

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

今度はTripのインスタンスが必要なときはいつでも。時にはあなたはSUVにFourWheelを初期化させたいかもしれませんまたは時々あなたはセダンを望むかもしれません。それは本当にあなたが特定の状況に基づいて欲しいものに依存します。

この問題を解決するには、作成パターンとしてファクトリーパターンを使用します。ファクトリが正しいインスタンスを返す場所。したがって、最終的には、オブジェクトを正しくインスタンス化するためだけの多くのグルーコードが発生します。 Springは、グルーコードがなくてもグルーコードの仕事を最もよくします。マッピングをXMLで宣言すると、自動的にオブジェクトが初期化されます。また、インスタンスにシングルトンアーキテクチャーを使用することも多くあります。これは、メモリ使用量の最適化に役立ちます。

これはコントロールの反転とも呼ばれます。これを行うための他のフレームワークは、Google guice、Pico containerなどです。

これとは別に、Springには検証フレームワーク、JDBC、iBatis、およびHibernate(およびその他多数)と共同でDAO層を幅広くサポートしています。データベーストランザクションに対する優れたトランザクション制御を提供します。

"Pro Spring"のような良い本で読むことができるSpringにはもっとたくさんあります。

以下のURLも役に立つかもしれません。
http://static.springframework.org/docs/Spring-MVC-step-by-step/ /
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework

59
Priyank

昔は、 Spring は( Guice PicoContainer 、...)のような依存性注入フレームワークでしたが、今ではトータルソリューションになっていますあなたを構築する エンタープライズアプリケーション

もちろん春の中心である春の依存性注入はまだそこにあります(そしてあなたはここで他の良い答えを見直すことができます)が、春からのより多くがあります....

Springにはたくさんのプロジェクトがあり、それぞれにいくつかのサブプロジェクトがあります( http://spring.io/projects )。誰かが春について話すとき、あなたは 春のプロジェクト 彼が話しているものを見つけなければなりません、それは 春のフレームワーク として知られている春のコアだけです、またはそれは別の春プロジェクトです。

あまりにも言及する価値があるいくつかの春のプロジェクトは次のとおりです。

あなたのアプリケーションにもう少し具体的な機能が必要な場合は、そこでも見つけることができます。

  • Spring Batch の開発を可能にするように設計されたバッチフレームワーク
    バッチアプリケーション
  • Spring HATEOAS HATEOASプリンシパルに基づくRESTapiベースの簡単な作成
  • Spring Mobile および Spring Andriod モバイルアプリケーション開発用
  • Spring Shell フル機能のShell(別名コマンドライン)アプリケーションを構築する
  • Spring Cloud および Spring Cloudデータフロー クラウドアプリケーションの場合

spring-social-facebook http://projects.spring.io/spring-social-facebook/ )など、いくつかの小さなプロジェクトもあります。

Spring Framework projectの一部であるSpring MVCモジュールがあるので、Web開発にspringを使用できます。または、 struts2 のように、springを他のWebフレームワークと共に使用することもできます。

38
Alireza Fattahi

春とは何ですか?私はまもなくその質問に答えますが、最初に、勝者ヒューゴによる例をもう一度見てみましょう。それは新しい例の必要性を正当化しないのでそれはすばらしい例ではありません。

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

完了しました。そのため、数百または数千のビューがある場合でも、Spring XMLのアプローチのように1行のコードを変更するだけで済みます。しかし、XMLの編集とは対照的に、コードの行を変更するには再コンパイルが必要ですか。私のうるさい友人、Antを使ってスクリプトを書いてください。

それでSpringは何のためのものですか?それは:

  1. 群れに従う盲目の開発者
  2. 大学でそのようなフレームワークを教えていないので大学院のプログラマーを雇いたくない雇用者
  3. 悪いデザインから始めてパッチワークを必要とするプロジェクト(victor hugoの例が示すように)

さらに読む: http://discuss.joelonsoftware.com/?joel.3.219431.12

23
Ash

非常に簡単に要約すると、私はSpringがあなたのアプリケーションの「接着剤」であると言います。異なるフレームワークとあなた自身のコードを統合するのに使われます。

18
Johan

春は3つのことです。

  1. Springは依存性注入を扱います。Martin Fowlerによる依存性注入に関する優れた紹介をお読みになることをお勧めします。
  2. Springが次に行うことは、優れたJavaライブラリをアプリケーションで使用するための非常にエレガントな方法でラップすることです。良い例として、SpringがTask ExecutorsとQuartz Schedulerをラップする方法を見てください。
  3. 3つ目は、SpringがREST、MVC WebフレームワークなどのWeb関連の実装を多数提供していることです。あなたは最初の2つにSpringを使っているので彼らは計算します、多分あなたはあなたのウェブアプリが必要とするすべてのものにそれを使うことができます。

問題は、Spring DIは本当によく考えられていて、他のものの周りのラッパーは、他のものがすべてを考え出していて、Springがそれをうまくラップしているという点で、本当によく考えられているということです。 MVCやREST、その他のもののSpringによる実装はそれほどうまくいっていません(YMMV、IMHO)が、例外があります(Spring Securityはダボムです)。 それで私はSpringにDIを使い、そのクールなラッパーを使う傾向がありますが(Tapestryがとても好きですが)他のものを好みます、REST(Jerseyは本当に堅牢です)、等

13
karstensrage

Springを使ったWebアプリケーションにおそらく欲しいもの -

  • Spring MVCでは、2.5以上でPOJOをControllerクラスとして使うことができます(つまり、StrutsやSpring 2.5以前のように)特定のフレームワークから拡張する必要はありません。依存性注入のおかげで、コントローラークラスもテストが非常に簡単です。
  • HibernateとのSpring統合。これは、そのORMソリューションでの作業を単純化するのに役立ちます(ほとんどの場合)。
  • WebアプリケーションにSpringを使用すると、アプリケーションのすべてのレベルでドメインオブジェクトを使用できます。Hibernateを使用してマッピングされたのと同じクラスが、「フォームBean」として使用するクラスです。本質的に、これはクラスの数を減らそうとしているという理由で、より堅牢なドメインモデルにつながります。
  • Springフォームタグを使用すると、あまり手間をかけずにフォームを簡単に作成できます。

さらに、Springは巨大です。したがって、Spring AOPやSpring Securityなど、Webアプリケーションで使用することに関心があると思われることが他にもたくさんあります。しかし、上記の4つのことは、Webアプリケーションで使用されるSpringの一般的なコンポーネントを説明しています。

11
bpapa

これには2つの部分があります。

  1. 「まさにSpringは何のために」 - >勝者ヒューゴーによって受け入れられた答えを見てください。
  2. "[...] SpringはWeb開発のための[良い]フレームワークです" - >これを言っている人々はSpring MVCについて話しています。 Spring MVCは、Springの多くの部分の1つであり、依存性注入のように、Springの一般的な機能を利用するWebフレームワークです。それは非常に構成可能であるという点でそれはかなり一般的なフレームワークです:あなたは異なるdb層(Hibernate、iBatis、プレーンJDBC)、異なるビュー層(JSP、Velocity、Freemarker ...)を使うことができます

Spring MVCを使用せずにWebアプリケーションでSpringを完全に使用できることに注意してください。 Wicket、Struts、Seamなどの他のWebフレームワークを使用しながら、ほとんどのJava Webアプリケーションがこれを行うと思います。

8
Tom De Leu

Springはクラスのインスタンスをまとめるのに最適です。あなたのHibernateクラスは常にデータソースを必要とすることを知っています、Springはそれらを結び付けます(そしてデータソースの実装も持っています)。

あなたのデータアクセスオブジェクトは常にHibernateアクセスを必要とするでしょう、SpringはあなたのためにあなたのDAOにHibernateクラスを配線します。

さらに、Springは基本的にたくさんのライブラリの堅実な構成を提供し、その中で、どのlibを使用すべきかについてのガイダンスを提供します。

春は本当に素晴らしいツールです。 (私はSpring MVCについて話しているのではなく、基本フレームワークだけについて話していました)。

7
stevedbrown

Springは設定のためのさまざまなアノテーションのサポートを導入して以来、受け入れられた答えはアノテーションの使用を含みません。

スプリング(依存性注入)アプローチ

XMLファイルを使用してクラスを結び付けるもう1つの方法があります。それはアノテーションです。承認された回答の例を使用して、アノテーション@Component@Service@Repository、または@Configurationのいずれかを使用してクラスにBeanを直接登録しましょう。

@Component
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

このようにしてビューが作成されると、魔法のようにUserListerが使えるようになります。

上記のステートメントは、XMLファイルの使用や関連する実装を見つけてそれを挿入する別のアノテーション@Autowiredとの配線を必要としないという少しのボーナスで有効です。

@Autowired
private UserLister userLister;

Bean実装に注入させるために使用されるメソッドに@Beanアノテーションを使用します。

5
Nikolas

利点は 依存性注入(DI) です。それはオブジェクト作成のタスクをアウトソーシングすることを意味します。例を挙げて説明しましょう。

public interface Lunch
{
   public void eat();
}

public class Buffet implements Lunch
{
   public void eat()
   {
      // Eat as much as you can 
   }
}

public class Plated implements Lunch
{
   public void eat()
   {
      // Eat a limited portion
   }
}

今私のコードでは、私は次のようにクラスLunchDecideがあります:

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(){
        this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
        //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion 
    }
}

上記のクラスでは、気分に応じて、Buffet()またはPlated()を選びます。しかし、このシステムは密接に関連しています。異なる種類のオブジェクトが必要になるたびに、コードを変更する必要があります。この場合、行をコメントアウトしてください。 50人の人々によって使用される50の異なるクラスがあると想像してください。それは混乱の地獄だろう。この場合、システムを分離する必要があります。 LunchDecideクラスを書き換えましょう。

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

Newキーワードを使用してオブジェクトを作成する代わりに、コンストラクタへのパラメータとしてLunch Typeのオブジェクトへの参照を渡しました。ここでは、オブジェクトの作成は外部委託されています。このコードは、Xml設定ファイル(レガシー)またはJava Annotations(モダン)のいずれかを使用して配線できます。どちらの方法でも、どのタイプのオブジェクトを作成するかは、実行時に決定されます。オブジェクトは私たちのコードにXmlによって注入されるでしょう - 私たちのコードはその仕事のためにXmlに依存しています。したがって、依存性注入(DI)。 DIは私たちのシステムを疎結合にするのを助けるだけでなく、依存関係を偽造することを可能にするのでユニットテストの記述を単純化します。大事なことを言い忘れましたが、DIはアスペクト指向プログラミング(AOP)を合理化し、それがさらなる分離とモジュール性の向上をもたらします。上記のDIはコンストラクタインジェクションです。 DIはセッターインジェクションによっても行うことができます - カプセル化による同じ普通のセッターメソッドです。

4
Sumit Pokhrel

Springは Enterprise JavaBeans(EJB) technologyに代わる優れた選択肢です。 WebフレームワークとWebサービスフレームワークコンポーネントもあります。

3
fastcodejava
  • SpringはJ2EEと比較して軽量で柔軟なフレームワークです。
  • スプリングコンテナは制御の反転として機能します。
  • SpringはAOP、つまりプロキシと、シングルトン、ファクトリ、およびテンプレートメソッドデザインのパターンを使用します。
  • 階層型アーキテクチャ:懸念事項と再利用可能なレイヤの分離、およびメンテナンスの容易さ。

enter image description here

2
Premraj

Springは最初の段階では依存性注入でしたが、それからほとんどすべてのものにラッパーの王様を追加しました(JPA実装上のラッパーなど)。

長い話…Springの大部分はXMLソリューション(XMLスクリプトエンジン... brrrr)を好むので、DIにはGuiceを使用します。

良いライブラリだが、例えば Spring JDBC(本当の名前のパラメータを持つ1つのJava jdbcソリューションなど)が次のMavenから採用されている。

Web開発のためにSpring MVC( "big spring"の一部)を使用しています...それは "リクエストベース"のフレームワークです、聖戦 "リクエスト対コンポーネント"があります...あなた次第

1
Jacek Cz

Springはかなり単純な依存性注入システムとして始まりました。今ではそれは巨大で、その中にすべてがあります(ことわざのある台所の流しを除く)。

しかし、心配する必要はありません。それはかなりモジュラー式なので、必要なものだけを使用できます。

どこから始まったのかを確認するには、次のようにします。

http://www.Amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

古すぎるかもしれませんが、すばらしい本です。

今度はSpring専用のもう1冊の良い本があります。

http://www.Amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

また、Springの古いバージョンも参照していますが、検討する価値があります。

1
Pablojim

過去に私はSpringフレームワークについて純粋に技術的な観点から考えました。

チームワークとエンタープライズWebアプリケーションの開発の経験があるとすれば、Springはアプリケーションの開発の高速化(Webアプリケーション)×分離)個々の要素(Bean)のためのものです。 Springでは、アプリケーションの構築(配線)の責任をSpringフレームワークに移すことができますSpringフレームワークの依存性注入)は、個々のBeanを動作中のアプリケーションに接続/配線する役割を果たします。

このように、開発者は、Bean間のインターフェースが定義されたらすぐに、個々のコンポーネント(Bean)の開発に集中することができます。

そのようなアプリケーションのテストは簡単です - 主な焦点は個々のBeanに与えられます。それらは簡単に分離してモックすることができるので、単体テストは速く効率的です。

Springフレームワークは@Controller@Restcontroller)、@Repository@Component)のような複数の特殊なBeanを定義しています。SpringはMavenと一緒になって次のような構造を提供します。個々の要素が離れていて再利用できるため、チーム作業は簡単で迅速です。

0
Witold Kaczurba

Springフレームワークは間違いなくRest開発に特化したWeb開発に適しています。それは 依存性注入 そして spring securityのような他のモジュールとの統合spring aopmvc frameworkmicroservices

あなたが間違いなく構築するどんなアプリケーションにもセキュリティが必要です。
あなたが製品を造っているなら、長いメンテナンス、そしてあなたは間違いなくAop概念を必要とするでしょう。

アプリケーションの負荷がもっと大きい場合は、マイクロサービスを実装する必要があります。

Springはこれらすべてを1つのプラットフォームで提供しています。 多数のモジュールをサポート
主なことは、春が オープンソース そして拡張可能なフレームワークであり、ライフサイクルにカスタムコードを統合するためのいたるところにフックがあることです。

Spring Data はあなたのプロジェクトとの統合を提供する一つのプロジェクトです。


アプリケーションを構築するために必要なものはすべてSpringです。

0
pratik deshai