私は 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フレームワークを構成する方法はいくつありますか?
混乱を避けるために、構成定義とbean定義を理解する必要があります2つの異なるものです。構成を定義するには3つの方法があり、デフォルトでSpring 4で使用できます。
また、アプリケーションに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つの方法が変わります(デフォルト)。しかし、もちろん、これらの方法はすべて互いに組み合わせて使用できます。
これを理解する最も簡単な方法は、フレームワークの長い歴史をどのように開発したかを調べることです。
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クラスを使用します)の他に、コンテキストを作成する他の方法があります。
最初は、彼のより機知に富んだ答えに感謝しますKen Bekov。私は、誰もがこの分野についてより多くを学ぶことができるように、彼の答えを即興にしようとしました。
構成定義:
Spring 4には、その構成を定義する3つの方法が含まれています。彼らです
注釈の利点:
すべてのinformation is in a single file
(特定の動作を構成するために2つのファイルを開く必要はありません)
クラスが変更されると、no need to modify the xml file
アノテーションは、アプリケーションコードをリファクタリングするときに、より直感的で堅牢であるとよく言われました。また、より良い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ファイルの利点:
POJOとその動作の明確な分離
どのPOJOが動作の原因であるかわからない場合、そのPOJOを見つけるのは簡単です(すべてのソースコードではなくファイルのサブセットを検索する)
XMLには、アプリケーションコード自体から明確に分離されて定義された宣言スタイルの唯一の利点があります。これは、DIの懸念から独立しています。欠点は、verbosity
、poor re-factoring
robustness
、およびa general runtime failure
の動作です。 IDE Javaなどのサポートと比較してほとんどメリットのない一般的な(XML)ツールのサポートがあります。このXMLに加えて、パフォーマンスオーバーヘッドが伴うため、通常はslower than code solutions
です。
XMLおよび注釈ベースのリンク:
Groovyベースのリンク:
Bean定義:
クラスパスのスキャン:
xml-configの場合<context:component-scan base-package="..."/>
、Java-configの場合-@ComponentScan
アノテーション、Groovy ctx.'component-scan'(...)
呼び出しの場合。
依存性注入:
Xmlベースの構成では、dependency injection
はxml
で手動で、またはannotations
(@ Autowire、@ Requiredなど)を使用して実行できます。その場合は<context:annotation-config/>
を定義する必要があります
質問と回答:
Q1:注釈ベースの(いわゆる)構成が、実際には上記のAnnotationConfigApplicationContextではなくClassPathXmlApplicationContextを使用しているのはなぜですか?
Ans:これは、注釈ベースのBean定義を使用したxmlベースの構成です。
アプリケーションコンテキスト:
AnnotationConfigApplicationContext:
1 . AnnotationConfigApplicationContextおよび親コンテキスト
ClassPathXmlApplicationContext:
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フレームワークを構成できます。
ではない正確に。 Springフレームワークを構成する方法は2つしかありません。 Springフレームワークの2つの基本的な構成ツールは次のとおりです。
どちらも次の目的に使用できます。
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つしかありません。
そして、それらは混合することができます
ただし、すべてのBeanは3つの方法で宣言できます。
@Bean
注釈付きBean内の@Configuration
注釈付き@Component
(または特殊な注釈@Controller
、@Service
などのいずれか)で直接今、あなたの正確な質問のために:
(いわゆる)注釈ベースの構成が実際に上記のAnnotationConfigApplicationContextではなくClassPathXmlApplicationContextを使用しているのはなぜですか?
ApplicationContextは最初にxml構成ファイルから初期化されるため。パッケージのスキャンは、後で<context:scan ...>
タグを使用して行われます。 AnnotationConfigApplicationContext
を使用するのは、構成クラスから、またはパッケージスキャンを通じて直接初期化する場合です。
この本で説明されているJavaベースの構成は、注釈ベースの構成と呼ばれるべきもののように思われます。
彼らはそれを呼び出しますJavaベース
私は本を見ていないが、あなたの仮定は実際に正しい。
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統合を備え、メッセージの国際化をサポートするため、エンタープライズアプリケーションで使用されます。
それがお役に立てば幸いです。
最初にコーディングの違いを最初に示しましょう:
<bean/>
を使用してxmlコンテキストファイル内にSpring Beanを登録する必要がありますJava構成:@Configuration
および@Bean
を使用して、コンテキストでSpring Beanを登録する必要があります。
注釈:@Component
とその友人を使用することにより、実際には他の2つと一緒に使用できます:
<context:component-scan/>
を使用したXML@ComponentScan
を使用した構成ClassPathXmlApplicationContext
を使用した理由は、xmlを使用してコンポーネントスキャンを構成したが、@ComponentScan
を使用した場合、AnnotationConfigApplicationContext
を使用するためです。
だから私にとっては、春のコンテキストxmlまたはJava設定と注釈はオプションのいずれか1つで使用するか、まったく使用しないオプションを初期化する2つの方法と考えています。
スプリングフレームワークを構成する3つの方法は、相互に排他的であることを意図したものではありません。実際、私の推測では、平均して少なくとも2つが一緒に使用されています。
注釈ベースの構成は、ソースコード全体に本質的に散在するメタデータに依存しているという理由だけで、スタンドアロンで使用される可能性が最も低くなります。
AnnotationConfigApplicationContext
pureアノテーションベースのコンテキストを起動するために使用できます、ただし、渡す必要がありますすべてのクラスは、単一の(またはいくつかの)@Component
-注釈付きクラスを渡すのではなく、@Configuration
または派生物として注釈付けされます-通常はそうではありません実用的。
これは、BeanをXMLまたはJava構成で静的にリストすることとほとんど同じですが、アプリケーションコンテキスト自体をビルドするときにコードでこれを行う必要があるため、あまり役に立ちません。 、(Webコンテキストなどで)アプリケーションコンテキストを自動的に起動するさまざまな賢い方法の恩恵を受けることができないためです。
そのため、おそらくオブジェクトグラフメタデータ全体を一度に組み立てることができます。また、は、XMLまたはJavaベースのconfigでのみ達成できます。オブジェクトグラフ全体を記述する「集中型」メタデータ。
XMLとJavaベースのアプローチの両方で、この「集中メタデータ」(<beans>
または@Configuration
)は静的に(明示的な<bean>
または@Bean
定義で)または動的に( <component-scan>
または@ComponentScan
)を使用します。したがって、これら2つのアプローチは、「分散型」メタデータを収集するための注釈ベースの構成の利点を享受できる、ほぼ同じ機能を備えた異なる形式であると言うのは理にかなっています。