私はSpringについてよく耳にします。人々は、SpringはWeb開発の優れたフレームワークであるとWebの至る所で言っています。Spring Frameworkの正確な目的は何ですか?
私はSpringについてよく耳にします。人々は、SpringはWeb開発の優れたフレームワークであるとWebの至る所で言っています。Spring Frameworkの正確な目的は何ですか?
回答:
基本的にSpringは 依存性注入 これは、非常に分離されたシステムの構築を可能にするパターンです。
たとえば、システムのユーザーをリストして、次のようなインターフェイスを宣言する必要があるとします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ファイルまたは注釈を使用してクラスを接続することです。これにより、すべてのオブジェクトがSpringによってインスタンス化および初期化され、適切な場所(サーブレット、Webフレームワーク、ビジネスクラス、DAOなど)に挿入されます。 ...)。
Springの例に戻ると、userLister
フィールドのセッターと次のようなXMLファイルのいずれかが必要です。
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
または、単にビュークラスにファイルされたアノテーションを付けます@Inject
。
@Inject
private UserLister userLister;
このようにして、ビューが作成されると、魔法のようUserLister
に動作する準備が整います。
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
それは素晴らしいです!だよね?
UserLister
インターフェイスの別の実装を使用したい場合はどうなりますか?XMLを変更するだけです。UserLister
実装の準備ができていない場合はどうなりますか?UserLister
ビューの一時的なモック実装をプログラムし、ビューの開発を容易にします。Dependency Injectionには他にもいくつかのオプションがありますが、私の意見では、Springのシンプルさ、優雅さ、安定性に加えて、Springが非常に有名になったのは、SpringSourceの担当者が多くのPOJOをプログラミングして、Springを他の多くの一般的なフレームワークと統合するのに役立つということです。アプリケーションに侵入します。また、Springには、Spring MVC、Spring WebFlow、Spring Securityなどの優れたサブプロジェクトがいくつかあります。
お役に立てれば。とにかく、Martin Fowlerの依存性注入と制御の逆転に関する記事を読むことをお勧めします。彼は私よりも優れているからです。基本を理解した後、Spring Documentationをご覧ください。私の意見では 、これは史上最高のSpringブックとして使用されています。
Springには(Skafmanが正しく指摘したように)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コンテナなどです。
これとは別に、Springには検証フレームワークがあり、JDBC、iBatis、Hibernate(およびその他多数)と連携してDAOレイヤーを幅広くサポートしています。データベーストランザクションに対する優れたトランザクション制御を提供します。
Springには、「Pro 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
昔、Springは(Guice、PicoContainer、...)と同様の依存性注入フレームワークでしたが、現在では、エンタープライズアプリケーションを構築するための完全なソリューションになっています。
もちろん、Spring Dependency Injection、つまり、Springの心臓部はまだそこにあります(そして、他の良い答えをここで確認できます)が、Springからはまだまだあります...
Springには多数のプロジェクトがあり、それぞれにいくつかのサブプロジェクトがあります(http://spring.io/projects)。誰かが春について話すとき、あなたは彼が話している春のプロジェクトを見つけなければなりません、それは春の枠組みとして知られているそれだけの春のコアであるか、それは別の春のプロジェクトです。
言及する価値があるいくつかの春のプロジェクトは次のとおりです。
アプリケーションにさらに特定の機能が必要な場合は、そこにも見つけることができます。
例えば、spring-social-facebook(http://projects.spring.io/spring-social-facebook/)などの小さなプロジェクトもいくつかあります。
Spring FrameworkプロジェクトのSpring MVC
一部であるモジュールを備えているため、Web開発にSpringを使用できます。または、struts2などの別のWebフレームワークでSpringを使用することもできます。
春は何ですか?私はその質問にすぐ答えますが、最初に、ビクターヒューゴの例をもう一度見てみましょう。新しいフレームワークの必要性を正当化しないため、これは良い例ではありません。
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の目的は何でしょうか?それは:
UserLister
)が1つだけ必要なため、この例は機能しますが、異なる子の間で共有されていない複数のサービスが必要な場合はどうBaseView
でしょうか。(幸いなことに)Javaには多重継承はありません。
春は3つです。
問題は、Spring DIが本当によく考えられていることです。他のものはすべてがよく考えられており、Springがそれをうまくラップするという点で、他のもののラッパーは本当によく考えられています。MVCとRESTのSpringの実装とその他すべてのものはうまくいきませんが(YMMV、IMHO)、例外があります(Spring Securityは爆弾です)。だから私はDIのためのSpringとそのクールなラッパーを使用する傾向がありますが、Web(タペストリーがとても好きです)、REST(ジャージーは本当に堅牢です)などの他のものを好みます。
SpringでWebアプリケーションにおそらく必要なもの-
さらに、Springは非常に巨大です。そのため、Spring AOPやSpring Securityなど、Webアプリでの使用に興味を持つ可能性のあるものが他にもたくさんあります。ただし、上記の4つは、Webアプリで使用されるSpringの一般的なコンポーネントについて説明しています。
これには2つの部分があります。
Spring MVCを使用しなくても、Webアプリケーションで完全に適切にSpringを使用できることに注意してください。Wicket、Struts、Seamなどの他のWebフレームワークを使用しながら、ほとんどのJava Webアプリケーションがこれを行うと思います...
Springは、クラスのインスタンスを接着するのに最適です。Hibernateクラスは常にデータソースを必要とすることを知っています。Springはそれらを一緒にワイヤリングします(データソースの実装も持っています)。
データアクセスオブジェクトには常にHibernateアクセスが必要です。SpringはHibernateクラスをDAOにワイヤリングします。
さらに、Springは基本的に一連のライブラリの堅固な構成を提供し、その中で、どのライブラリを使用すべきかについてのガイダンスを提供します。
春は本当に素晴らしいツールです。(私はSpring MVCについて話しているのではなく、単にベースフレームワークについて話していました)。
Springは構成用のさまざまな注釈のサポートを導入したため、受け入れられた回答には注釈の使用は含まれていません。
そこで、XMLファイルを使用してクラスを結び付ける別の方法として、注釈があります。のは、受け入れ答えからの例を使用してみましょうと注釈のいずれかを使用して、クラスに直接Beanを登録し@Component
、@Service
、@Repository
または@Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
このようにして、ビューが作成されると、魔法のようにUserListerが動作するようになります。
上記のステートメントは有効ですが、XMLファイルを使用する必要がなく@Autowired
、関連する実装を見つけて挿入する別の注釈と接続する必要はありません。
@Autowired
private UserLister userLister;
使用@Bean
注入するBean実装を取得するために使用される方法に注釈を。
@Bean
クラスレベルではアノテーションを使用できません。いずれかでなければなりません@Component
、@Service
、@Repository
残りが正しいかなど。この方法でのインターフェイスの自動配線は、注入に適したクラスパスに候補クラスが1つしかない場合にのみ機能することも指摘してください。そうでない場合、Springアプリケーションエラーが発生します。
利点は、依存性注入(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
}
}
新しいキーワードを使用してオブジェクトを作成する代わりに、Lunch Typeのオブジェクトへの参照をパラメーターとしてコンストラクターに渡したことに注意してください。ここでは、オブジェクトの作成を外部委託しています。このコードは、Xml構成ファイル(レガシー)またはJava注釈(モダン)を使用して接続できます。どちらの方法でも、作成するオブジェクトのタイプの決定は、実行時にそこで行われます。オブジェクトは、Xmlによってコードに挿入されます。コードは、そのジョブのXmlに依存しています。したがって、依存性注入(DI)。DIは、システムを疎結合にするのに役立つだけでなく、依存関係を模倣できるので、単体テストの作成を簡素化します。最後になりましたが、DIはアスペクト指向プログラミング(AOP)を合理化し、モジュール化のさらなる分離と向上につながります。また、上記のDIはコンストラクターインジェクションです。
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Springは、Enterprise JavaBeans(EJB)テクノロジーの優れた代替手段です。また、WebフレームワークとWebサービスフレームワークコンポーネントもあります。
Springは、かなり単純な依存性注入システムとして始まりました。今ではそれは巨大であり、中にはすべてがあります(格言の台所の流しを除く)。
しかし、恐れることはありません。それは非常にモジュール化されているので、必要な部分だけを使用できます。
すべての始まりを確認するには、次のことを試してください。
古いかもしれませんが、素晴らしい本です。
今回はSpring専用の別の優れた本については、以下を参照してください。
また、Springの古いバージョンを参照していますが、一見の価値があります。
Springは最初は依存関係の注入でしたが、ほとんどすべてのラッパー(JPA実装のラッパーなど)のラッパーを追加しました。
長い話... Springのほとんどの部分はXMLソリューション(XMLスクリプトエンジン... brrrr)を優先するので、DIにはGuiceを使用します
良いライブラリですが、例えば、Spring JDBC(多分、実際の名前のパラメーターを持つ1つのJava jdbcソリューション)が大きくなるdepnedenciecにより、次にmaven 4-5を採用しています。
Spring MVC(「ビッグスプリング」の一部)をWeb開発に使用する...これは「要求ベース」のフレームワークであり、「要求vsコンポーネント」という聖なる戦争があります...
以前は、純粋に技術的な観点からSpringフレームワークについて考えていました。
チームワークとエンタープライズWebアプリケーションの開発の経験を考えると、Springは個々の要素(beans)を分離することにより、アプリケーション(webアプリケーション)の開発を高速化するためのものだと思います。開発が速くなると、人気が高まります。Springでは、アプリケーションの構築(配線)の責任をSpringフレームワークに移すことができます。Springフレームワークの依存性注入は、個々のBeanを動作中のアプリケーションに接続/配線する責任があります。
このようにして、開発者は、Bean間のインターフェースが定義されるとすぐに、個々のコンポーネント(Bean)の開発により集中することができます。
このようなアプリケーションのテストは簡単です。主な焦点は個々のBeanにあります。これらは簡単に分離およびモックできるため、ユニットテストは高速で効率的です。
Springフレームワークは、@ Controller(@Restcontroller)、@ Repository、@ Componentなどの複数の特殊なBeanを定義して、Webの目的を果たします。SpringとMavenは、開発者にとって直感的な構造を提供します。個別の要素が分離され、再利用できるため、チーム作業は簡単かつ迅速です。
Springフレームワークは、Web開発に最適であり、残りのAPIサービスにより具体的です。
それはのために良いですので、その上記の依存性注入 のような他のモジュールと統合春のセキュリティ、スプリングAOP、MVCフレームワーク、microservices
どのアプリケーションでも、セキュリティはおそらく要件です。
長いメンテナンスが必要な製品を構築する場合は、Aopコンセプトを活用する必要があります。
アプリケーションに大量のトラフィックがあり、負荷が増加している場合は、マイクロサービスの概念を使用する必要があります。
Springはこれらすべての機能を1つのプラットフォームで提供しています。多くのモジュールでのサポート。
最も重要なことは、Springはオープンソースであり、拡張可能なフレームワークであり、ライフサイクルにカスタムコードを統合するためのあらゆる場所にフックがあります。
Spring Dataは、プロジェクトとの統合を提供する1つのプロジェクトです。
したがって、春はほとんどすべての要件に適合することができます。