web-dev-qa-db-ja.com

Springフレームワークを構成する方法はいくつありますか?それらの技術的な違いは何ですか? (賛否両論ではありません。)

私は this 本(これを強くお勧めします)を勉強していますが、著者がSpringフレームワークの構成方法を説明する方法について混乱しています。

本で使用されているいくつかのコード例を見ることができます here 。 (これらは誰でも利用できます。)参照したいコードは、第2章のコードです。

とにかく、本は、Spring Containerを構成するための3つの方法があると述べています


XML-ベースの構成

これには、次のようなxmlファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>

    <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>

    <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">
    </bean>

</beans>

そして、bootstrap Springにするために、使用されるコードは次のようになります。

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/com/wiley/beginningspring/ch2/ch2-beans.xml");

現時点では混乱はありません。


Javaベースの構成

この構成メソッドには、次のような構成のクラスがあります。

@Configuration
public class Ch2BeanConfiguration {

    @Bean
    public AccountService accountService() {
        AccountServiceImpl bean = new AccountServiceImpl();
        bean.setAccountDao(accountDao());
        return bean;
    }

    @Bean
    public AccountDao accountDao() {
        AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
        return bean;
    }
}

springのブートストラップを担当するコードは次のようになります。

ApplicationContext applicationContext
            = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);

ここまでは、すべてが明らかです。 (種類..)また、ここでは実際に@Configurationと呼ばれる注釈があります...


注釈ベースの構成

本で説明されている最後の設定方法は、Annotation Based Configurationです。

XMLベースの構成の場合と同様のxmlファイルがありますが、はるかに小さいファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
    <context:component-scan base-package="com.wiley.beginningspring.ch2"/>
</beans>

すべてのBeanには、次のような注釈があります。

@Component, @Service

等..

そして、すべての依存関係には注釈があります。

@Autowired

beanを注入できるようにします。

この構成方法でSpringフレームワークをブートストラップする方法は次のとおりです。

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/ch2-beans.xml");

ここに私の質問があります:

(いわゆる)Annotation Based Configurationが実際にClassPathXmlApplicationContextを使用している理由ただし、上記のAnnotationConfigApplicationContextではありませんか?後者は、「注釈ベース」という言葉が含まれる構成で使用する方がはるかに適切なようです。

本で説明されているJavaベースの構成は、注釈ベースの構成。?

そして、本で説明されている注釈ベースの構成は、実際には次のように思えます。AutowiredBeanを使用したXMLベースの構成。 「Javaベースの構成」にある@Configurationアノテーションすらありません。

Springフレームワークを構成する方法はいくつありますか?

37
Koray Tugay

混乱を避けるために、構成定義bean定義を理解する必要があります2つの異なるものです。構成を定義するには3つの方法があり、デフォルトでSpring 4で使用できます。

  • xml-based構成、xmlファイルで構成を記述する場合。
  • Javaベースの構成、構成がJavaクラス、特定の注釈でマークされている場合;
  • groovy-based構成、構成がGroovyコードのファイルの場合;

また、アプリケーションにBean定義を追加するには2つの方法があります。

  • bean内の構成bean定義。宣言で構成内にBeanを手動で追加する場合。

    この場合、定義は構成タイプに基づきます。 xml-configの場合は<bean/>タグ、Javaベースの構成の場合は-Groovyの@Beanアノテーションとbeans {...}構築を含むメソッドです。

  • 注釈ベースBean定義、特定の注釈(@Component@Service@Controllerなど)でBeanクラスをマークする場合。このタイプの構成では、 クラスパススキャン を使用します。

    この場合、クラスパスをスキャンするためのディレクティブを指定する必要があります。 xml-configの場合は<context:component-scan base-package="..."/>、Java-configの場合は@ComponentScanアノテーション、Groovy ctx.'component-scan'(...)の呼び出しです。

ご覧のとおり、構成とBean定義をさまざまな組み合わせで使用できます。

Xmlベースの設定を使用する場合、依存関係注入を駆動するアプローチを選択できます。xmlで手動で、または注釈(@Autowire@Requiredなど)を使用してください。後半の場合、<context:annotation-config/>を定義する必要があります。ただし、Bean定義と依存関係注入制御を混同しないでください。

この観点に基づいて、質問に答えてみましょう。

(いわゆる)注釈ベースの構成が実際に上記のAnnotationConfigApplicationContextではなくClassPathXmlApplicationContextを使用しているのはなぜですか?

本の著者は概念を混同しました。実際、これは注釈ベースのBean定義を使用したxmlベースの構成です。

この本で説明されているJavaベースの構成は、注釈ベースの構成と呼ばれるべきもののように思われます。

あなたは正しい-Javaベースの設定は実際に注釈を積極的に使用し、注釈ベースと呼ばれる可能性があります。しかし注釈はJavaの一部です。さらにこれは伝統的な用語 指定ドキュメント内

Springフレームワークを構成する方法はいくつありますか?

そのため、デフォルトでは、構成を記述する3つの方法と、Beanを定義する2つの方法があります。これで、Springフレームワークを構成する6つの方法が変わります(デフォルト)。しかし、もちろん、これらの方法はすべて互いに組み合わせて使用​​できます。

43
Ken Bekov

これを理解する最も簡単な方法は、フレームワークの長い歴史をどのように開発したかを調べることです。

  • XMLベースの構成-これは最初からそこにありました-バージョン1- ClassPathXmlApplicationContextのjavadoc を参照してください。これは2004年3月頃で、J2EE 1.4の頃でした。XML構成が非常に大きく、Springが大幅に簡素化されました(XMLもシンプルですが)。これは、自動配線の指定や、どこに直接依存するかなど、すべてにXMLを使用します(ref = "accoundDao"の例)。

  • 注釈ベースの構成-Spring 2.5では、これはJava EE 5、 @ Autowired などの新しい注釈が導入されましたが、XMLにはまだいくつかのコンテキスト構成がありました。ファイル-通常、どのパッケージをスキャンするかを定義し、残りの部分は注釈に基づいて自動的に行われます-そのため名前。

  • Javaベースの構成はSpring 3に付属し、後のバージョンで改善されました。これは、 AnnotationConfigApplicationContext およびConfigurationアノテーションが導入された場合です。XMLを完全にドロップできる可能性があります-> Javaベースの構成。 aop、jdbcなどの多数のxmlヘルパータグの.

これら3つ(実際には2つは1と2は同じApplicationContextクラスを使用します)の他に、コンテキストを作成する他の方法があります。

9
frant.hartm

最初は、彼のより機知に富んだ答えに感謝しますKen Bekov。私は、誰もがこの分野についてより多くを学ぶことができるように、彼の答えを即興にしようとしました。

構成定義:

Spring 4には、その構成を定義する3つの方法が含まれています。彼らです

enter image description here

注釈の利点:

  1. すべてのinformation is in a single file(特定の動作を構成するために2つのファイルを開く必要はありません)

  2. クラスが変更されると、no need to modify the xml file

  3. アノテーションは、アプリケーションコードをリファクタリングするときに、より直感的で堅牢であるとよく言われました。また、より良いIDE guiseのようなガイダンスが提供します。しかし、アプリケーションコードをDIの懸念と混合します。アプリケーションはフレームワークに依存します。明確な分離はほとんど不可能です。Annotations are also limited when describing different injection behaviour at the same place (constructor, field) dependent on other circumstances (e.g. robot legs problem).さらに、外部クラス(ライブラリコード)を独自のソースのように扱うことができないため、XMLよりも高速に実行されると見なされます。

xmlファイルの利点:

  1. POJOとその動作の明確な分離

  2. どのPOJOが動作の原因であるかわからない場合、そのPOJOを見つけるのは簡単です(すべてのソースコードではなくファイルのサブセットを検索する)

  3. XMLには、アプリケーションコード自体から明確に分離されて定義された宣言スタイルの唯一の利点があります。これは、DIの懸念から独立しています。欠点は、verbositypoor re-factoringrobustness、およびa general runtime failureの動作です。 IDE Javaなどのサポートと比較してほとんどメリットのない一般的な(XML)ツールのサポートがあります。このXMLに加えて、パフォーマンスオーバーヘッドが伴うため、通常はslower than code solutionsです。

XMLおよび注釈ベースのリンク:

  1. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-annotation-config
  2. 注釈とXML、長所と短所
  3. Java依存性注入:XMLまたは注釈
  4. SpringアノテーションベースのDI対XML構成?
  5. Xml設定と注釈ベースの設定

Groovyベースのリンク:

  1. https://objectpartners.com/2016/01/12/using-groovy-based-spring-configuration/
  2. http://blog.andresteingress.com/2014/02/14/grails-Java-based-spring-config/

Bean定義:

Beanの定義には2つの方法があります。 enter image description here

クラスパスのスキャン:

xml-configの場合<context:component-scan base-package="..."/>Java-configの場合-@ComponentScanアノテーション、Groovy ctx.'component-scan'(...)呼び出しの場合。

依存性注入:

Xmlベースの構成では、dependency injectionxmlで手動で、またはannotations(@ Autowire、@ Requiredなど)を使用して実行できます。その場合は<context:annotation-config/>を定義する必要があります

質問と回答:

Q1:注釈ベースの(いわゆる)構成が、実際には上記のAnnotationConfigApplicationContextではなくClassPathXmlApplicationContextを使用しているのはなぜですか?

Ans:これは、注釈ベースのBean定義を使用したxmlベースの構成です。

アプリケーションコンテキスト:

  1. http://docs.spring.io/spring/docs/4.2.0.RELEASE/javadoc-api/org/springframework/context/ApplicationContext.html

AnnotationConfigApplicationContext:

1 . AnnotationConfigApplicationContextおよび親コンテキスト

ClassPathXmlApplicationContext:

  1. http://www.tutorialspoint.com/spring/spring_applicationcontext_container.htm
  2. http://www.mkyong.com/spring3/spring-3-hello-world-example/

Q2:この本で説明されているJavaベース構成は注釈ベース構成と呼ばれるべきもののように思われます。?

Ans:その場合は正しい。 Javaベースの設定はアノテーションを使用し、アノテーションベースの設定と呼ばれます。ただし、アノテーションはJavaの一部であり、他には何もありません。

しかし、入念に理解する必要がありますこの階層がxmlからアノテーションベースに、そして最後にgroovyベースになった理由

XMLセットアップの代替手段は、山括弧宣言の代わりにコンポーネントを配線するためにバイトコードメタデータに依存する注釈ベースの構成によって提供されます。開発者は、XMLを使用してBeanワイヤリングを記述する代わりに、関連するクラス、メソッド、またはフィールド宣言の注釈を使用して、構成をコンポーネントクラス自体に移動します。 「例:RequiredAnnotationBeanPostProcessor」と呼ばれるセクションで説明したように 、BeanPostProcessorをアノテーションと組み合わせて使用​​することは、Spring IoCコンテナーを拡張する一般的な手段です。たとえば、Spring 2.は、@Requiredアノテーションで必要なプロパティを強制する可能性を導入しました。

Spring 2.5は、Springの依存性注入を駆動するための同じ一般的なアプローチに従うことを可能にしました。基本的に、@Autowiredアノテーションは セクション6.4.5、「自動配線コラボレーター」 で説明されているのと同じ機能を提供しますが、よりきめ細かい制御と幅広い適用性を備えています。

Spring 2.5は、@PostConstruct@PreDestroyなどのJSR-250アノテーションのサポートも追加しました。

Spring 3. javax.injectパッケージに含まれる@Inject@NamedなどのJSR-330(Java用の依存性注入)注釈のサポートが追加されました。これらの注釈の詳細は、 関連セクション にあります。

Q3:Springフレームワークを設定する方法はいくつありますか?

Ans:

Theoretically,構成を記述する3つの方法と、Beanを定義する2つの方法。 Springフレームワークを構成するための3 * 2 = 6つの方法になります(デフォルト)。この方法はすべて、互いに組み合わせて使用​​できます。

But Actually,を1つのWordで使用すると、XMLまたはannotationsを使用してSpringフレームワークを構成できます。

5
SkyWalker

ではない正確に。 Springフレームワークを構成する方法は2つしかありません。 Springフレームワークの2つの基本的な構成ツールは次のとおりです。

  • XMLファイル(外部Javaファイル)
  • Java(5 +)ベースのアノテーション(内部Javaファイル)

どちらも次の目的に使用できます。

  • アプリケーションコンテキストの構成(Beanの追加を意味します)-具体的なアプリケーションコンテキストのコンストラクタは、xmlファイル、スキャンするパッケージ、またはロードする直接指定されたクラスを受け入れます
  • webアプリケーションの場合のアプリケーションコンテキストのブートストラップ-web.xmlの使用とWebApplicationInitializerを実装するクラスの使用

最後になりましたが:

  • <context:component-scan/>を使用して、xml構成ファイルから注釈をスキャンできます
  • @importを使用して、注釈付きの構成Beanからxmlファイルをロードできます。

本でJavaベースの設定と呼ばれる2番目の方法は、特定の注釈@Configurationです。通常、アノテーションが付けられたクラスはアプリケーションコンテキストのBeanになりますが、1つのメソッドに@Beanアノテーションを付けて他のBeanを宣言することもできます。これが、これらのクラスが通常、Beanスキャンの代わりに直接ロードされる理由です。

Annotation Based Configurationと呼ばれる3番目の方法は、2つのモードを単純に混合したものです。 。


TL/DR:springフレームワークでアプリケーションコンテキストを構成する方法は2つしかありません。

  • xml構成ファイル
  • Javaアノテーション

そして、それらは混合することができます

ただし、すべてのBeanは3つの方法で宣言できます。

  • xmlファイルから
  • @Bean注釈付きBean内の@Configuration注釈付き
  • @Component(または特殊な注釈@Controller@Serviceなどのいずれか)で直接

今、あなたの正確な質問のために:

(いわゆる)注釈ベースの構成が実際に上記のAnnotationConfigApplicationContextではなくClassPathXmlApplicationContextを使用しているのはなぜですか?

ApplicationContextは最初にxml構成ファイルから初期化されるため。パッケージのスキャンは、後で<context:scan ...>タグを使用して行われます。 AnnotationConfigApplicationContextを使用するのは、構成クラスから、またはパッケージスキャンを通じて直接初期化する場合です。

この本で説明されているJavaベースの構成は、注釈ベースの構成と呼ばれるべきもののように思われます。

彼らはそれを呼び出しますJavaベース

3
Serge Ballesta

私は本を​​見ていないが、あなたの仮定は実際に正しい。

Springアプリケーションを起動し、XML構成済みBeanを使用してすべてのBeanをフレームワークによってインスタンス化するには、ClassPathXmlApplicationContextを使用する必要があります。

SpringでBeanを構成するには2つの方法があります。

1)XML Bean 2)注釈アプローチ

基本的に、Spring 2.5-3ではXML Beanが使用され、Spring 4ではアノテーションアプローチがより多く使用されました。

@Bean // is a way to create a bean. It is the equalivant of the beans tag in XML.

@Configuration // is a way to tell the Spring container that this class is a list of configuration beans

Springには2つのスプリングコンテナがあります:

1)BeanFactory 2)ApplicationContext

BeanFactoryは最も単純なコンテナであり、1つの構成ファイルのみを受け入れます。 ApplicationContextは最も高度なSpringコンテナであり、構成ファイルの配列を受け入れ、JNDI統合、EJB統合を備え、メッセージの国際化をサポートするため、エンタープライズアプリケーションで使用されます。

それがお役に立てば幸いです。

1
Rajiv Jain

最初にコーディングの違いを最初に示しましょう:

  1. XML:<bean/>を使用してxmlコンテキストファイル内にSpring Beanを登録する必要があります
  2. Java構成:@Configurationおよび@Beanを使用して、コンテキストでSpring Beanを登録する必要があります。

  3. 注釈:@Componentとその友人を使用することにより、実際には他の2つと一緒に使用できます:

    1. <context:component-scan/>を使用したXML
    2. in Java @ComponentScanを使用した構成

ClassPathXmlApplicationContextを使用した理由は、xmlを使用してコンポーネントスキャンを構成したが、@ComponentScanを使用した場合、AnnotationConfigApplicationContextを使用するためです。

だから私にとっては、春のコンテキストxmlまたはJava設定と注釈はオプションのいずれか1つで使用するか、まったく使用しないオプションを初期化する2つの方法と考えています。

1

スプリングフレームワークを構成する3つの方法は、相互に排他的であることを意図したものではありません。実際、私の推測では、平均して少なくとも2つが一緒に使用されています。

注釈ベースの構成は、ソースコード全体に本質的に散在するメタデータに依存しているという理由だけで、スタンドアロンで使用される可能性が最も低くなります。

AnnotationConfigApplicationContextpureアノテーションベースのコンテキストを起動するために使用できます、ただし、渡す必要がありますすべてのクラスは、単一の(またはいくつかの)@Component-注釈付きクラスを渡すのではなく、@Configurationまたは派生物として注釈付けされます-通常はそうではありません実用的。

これは、BeanをXMLまたはJava構成で静的にリストすることとほとんど同じですが、アプリケーションコンテキスト自体をビルドするときにコードでこれを行う必要があるため、あまり役に立ちません。 、(Webコンテキストなどで)アプリケーションコンテキストを自動的に起動するさまざまな賢い方法の恩恵を受けることができないためです。

そのため、おそらくオブジェクトグラフメタデータ全体を一度に組み立てることができます。また、は、XMLまたはJavaベースのconfigでのみ達成できます。オブジェクトグラフ全体を記述する「集中型」メタデータ。

XMLとJavaベースのアプローチの両方で、この「集中メタデータ」(<beans>または@Configuration)は静的に(明示的な<bean>または@Bean定義で)または動的に( <component-scan>または@ComponentScan)を使用します。したがって、これら2つのアプローチは、「分散型」メタデータを収集するための注釈ベースの構成の利点を享受できる、ほぼ同じ機能を備えた異なる形式であると言うのは理にかなっています。

1
Costi Ciudatu