Spring について多くの人が聞いていますが、SpringはWeb開発に適したフレームワークであると人々は皆に言っています。 Spring Frameworkは正確には何のためのものですか?
基本的に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
の一時的モック実装をプログラムし、ビューの開発を容易にするDependency Injectionには他にもいくつかの選択肢があります。私の考えでは、Springをその単純さ、優雅さ、安定性以外に有名にしたのは、SpringSourceの人々がSpringを他の多くの一般的なフレームワークと統合するのに役立つことあなたのアプリケーションに邪魔をする。また、Springには、Spring MVC、Spring WebFlow、Spring Securityなど、いくつかの優れたサブプロジェクトがあります。
お役に立てれば。とにかく、 Martin Fowlerの記事 Dependency InjectionとInversion of Controlについて読んでおくことをお勧めします。 基本を理解したら、 Spring Documentation をご覧ください。、私の意見ではそれ です はかつて 史上最高の春の本でした。
Spring contains(Skaffmanが正しく指摘したように)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
昔は、 Spring は( Guice 、 PicoContainer 、...)のような依存性注入フレームワークでしたが、今ではトータルソリューションになっていますあなたを構築する エンタープライズアプリケーション 。
もちろん春の中心である春の依存性注入はまだそこにあります(そしてあなたはここで他の良い答えを見直すことができます)が、春からのより多くがあります....
Springにはたくさんのプロジェクトがあり、それぞれにいくつかのサブプロジェクトがあります( http://spring.io/projects )。誰かが春について話すとき、あなたは 春のプロジェクト 彼が話しているものを見つけなければなりません、それは 春のフレームワーク として知られている春のコアだけです、またはそれは別の春プロジェクトです。
あまりにも言及する価値があるいくつかの春のプロジェクトは次のとおりです。
あなたのアプリケーションにもう少し具体的な機能が必要な場合は、そこでも見つけることができます。
spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )など、いくつかの小さなプロジェクトもあります。
Spring Framework projectの一部であるSpring MVC
モジュールがあるので、Web開発にspringを使用できます。または、 struts2 のように、springを他のWebフレームワークと共に使用することもできます。
春とは何ですか?私はまもなくその質問に答えますが、最初に、勝者ヒューゴによる例をもう一度見てみましょう。それは新しい例の必要性を正当化しないのでそれはすばらしい例ではありません。
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は何のためのものですか?それは:
非常に簡単に要約すると、私はSpringがあなたのアプリケーションの「接着剤」であると言います。異なるフレームワークとあなた自身のコードを統合するのに使われます。
春は3つのことです。
問題は、Spring DIは本当によく考えられていて、他のものの周りのラッパーは、他のものがすべてを考え出していて、Springがそれをうまくラップしているという点で、本当によく考えられているということです。 MVCやREST、その他のもののSpringによる実装はそれほどうまくいっていません(YMMV、IMHO)が、例外があります(Spring Securityはダボムです)。 それで私はSpringにDIを使い、そのクールなラッパーを使う傾向がありますが(Tapestryがとても好きですが)他のものを好みます、REST(Jerseyは本当に堅牢です)、等
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はあなたのためにあなたのDAOにHibernateクラスを配線します。
さらに、Springは基本的にたくさんのライブラリの堅実な構成を提供し、その中で、どのlibを使用すべきかについてのガイダンスを提供します。
春は本当に素晴らしいツールです。 (私はSpring MVCについて話しているのではなく、基本フレームワークだけについて話していました)。
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
アノテーションを使用します。
利点は 依存性注入(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はセッターインジェクションによっても行うことができます - カプセル化による同じ普通のセッターメソッドです。
Springは Enterprise JavaBeans(EJB) technologyに代わる優れた選択肢です。 WebフレームワークとWebサービスフレームワークコンポーネントもあります。
Springは最初の段階では依存性注入でしたが、それからほとんどすべてのものにラッパーの王様を追加しました(JPA実装上のラッパーなど)。
長い話…Springの大部分はXMLソリューション(XMLスクリプトエンジン... brrrr)を好むので、DIにはGuiceを使用します。
良いライブラリだが、例えば Spring JDBC(本当の名前のパラメータを持つ1つのJava jdbcソリューションなど)が次のMavenから採用されている。
Web開発のためにSpring MVC( "big spring"の一部)を使用しています...それは "リクエストベース"のフレームワークです、聖戦 "リクエスト対コンポーネント"があります...あなた次第
Springはかなり単純な依存性注入システムとして始まりました。今ではそれは巨大で、その中にすべてがあります(ことわざのある台所の流しを除く)。
しかし、心配する必要はありません。それはかなりモジュラー式なので、必要なものだけを使用できます。
どこから始まったのかを確認するには、次のようにします。
古すぎるかもしれませんが、すばらしい本です。
今度はSpring専用のもう1冊の良い本があります。
また、Springの古いバージョンも参照していますが、検討する価値があります。
過去に私はSpringフレームワークについて純粋に技術的な観点から考えました。
チームワークとエンタープライズWebアプリケーションの開発の経験があるとすれば、Springはアプリケーションの開発の高速化(Webアプリケーション)×分離)個々の要素(Bean)のためのものです。 Springでは、アプリケーションの構築(配線)の責任をSpringフレームワークに移すことができますSpringフレームワークの依存性注入)は、個々のBeanを動作中のアプリケーションに接続/配線する役割を果たします。
このように、開発者は、Bean間のインターフェースが定義されたらすぐに、個々のコンポーネント(Bean)の開発に集中することができます。
そのようなアプリケーションのテストは簡単です - 主な焦点は個々のBeanに与えられます。それらは簡単に分離してモックすることができるので、単体テストは速く効率的です。
Springフレームワークは@Controller(@Restcontroller)、@Repository、@Component)のような複数の特殊なBeanを定義しています。SpringはMavenと一緒になって次のような構造を提供します。個々の要素が離れていて再利用できるため、チーム作業は簡単で迅速です。
Springフレームワークは間違いなくRest開発に特化したWeb開発に適しています。それは 依存性注入 そして spring securityのような他のモジュールとの統合 、 spring aop 、 mvc framework 、 microservices
あなたが間違いなく構築するどんなアプリケーションにもセキュリティが必要です。
あなたが製品を造っているなら、長いメンテナンス、そしてあなたは間違いなくAop概念を必要とするでしょう。
アプリケーションの負荷がもっと大きい場合は、マイクロサービスを実装する必要があります。
Springはこれらすべてを1つのプラットフォームで提供しています。 多数のモジュールをサポート
主なことは、春が オープンソース そして拡張可能なフレームワークであり、ライフサイクルにカスタムコードを統合するためのいたるところにフックがあることです。
Spring Data はあなたのプロジェクトとの統合を提供する一つのプロジェクトです。
アプリケーションを構築するために必要なものはすべてSpringです。