SpringのXMLファイル構成の12のテクニック


Springは強力なjavaプログラムフレームワークであり、javaのプログラムに広く応用されている.POJOでエンタープライズクラスのサービスを提供しています.Springは依存注入を利用して簡単で効率的な試験能力を得ることができる.Spring beans、依存関係、およびサービスに必要なbeanは、一般的にXML形式のプロファイルで記述されます.しかし、XMLプロファイルは冗長で使いにくく、beanを大量に使用している大きなプロジェクトでは読み取りや制御が難しくなります.この記事では、Spring XMLプロファイルに関する12種類のベストテクニックを示します.それらのいくつかは、最高のテクニックだけでなく、より多くの実際の意味を持っています.ドメインモデルの設計など、他の要因がXML構成に影響を及ぼすことに注意してください.しかし、この記事では、XML構成の可読性と操作性に注目しています.1.自動アセンブリSpringを使用すると、beanクラスの自省によって自動アセンブリ依存性が実現されることを回避します.これにより、beanの属性や構造関数のパラメータを明確に記述する必要はありません.プロパティ名のライブマッチングタイプに応じて、beanプロパティを自動的にアセンブリできます.コンストラクション関数は、マッチングタイプに応じて自動的にアセンブリできます.自動アセンブリを設定して自動検出することもできます.Springは適切なメカニズムを選択します.次の例を見てください.Springはbeanクラスの自省によって自動アセンブリ依存性を実現することができます.そうすれば、beanの属性や構造関数のパラメータを明確に記述する必要はありません.プロパティ名のライブマッチングタイプに応じて、beanプロパティを自動的にアセンブリできます.コンストラクション関数は、マッチングタイプに応じて自動的にアセンブリできます.自動アセンブリを設定して自動検出することもできます.Springは適切なメカニズムを選択します.OrderServiceクラスのプロパティ名がコンテナ内のbeanインスタンスと一致するように使用されます.自動アセンブリは、いくつかのタイプの情報を黙々と保存し、混乱を低減します.しかし、このような構成の直感性とメンテナンス性を犠牲にするため、実際のプロジェクトでは使用されません.多くのガイドラインと陳述資料はそれをSpringの非常にcoolの特性として称賛しているが,その欠点には言及していない.私の考えでは、Springのオブジェクトプールのように、ビジネスの味がもっと多くなりました.XMLプロファイルをより簡素化できるように見えますが、実際には複雑さが増しています.特に、あなたの大規模なプロジェクトで多くのbeanが定義されている場合はなおさらです.Springでは、自動アセンブリと手動アセンブリを混在させることができますが、この矛盾はXML構成をさらに理解しにくくします.2.ネーミング仕様を使用することは、Java符号化の理念と同様に、プロジェクトで常に明確で記述的で一貫したネーミング仕様を使用することは、開発者がXML構成を理解するのに非常に役立ちます.bean IDの例を挙げると、Javaクラスのプロパティのネーミング仕様に従うことができます.例えば、OrderServiceDAOのbean IDはorderServiceDAOであるべきである.大きなプロジェクトでは、bean IDの前にプレフィックスとしてパッケージ名を付けます.3.簡略化されたフォーマットを使用すると、サブエレメントではなく属性値と参照を属性として使用するため、冗長性を低減できます.次の例を見てください.

  
  
  
  
  1. <bean id="orderService" class="com.lizjason.spring.OrderService">  
  2. <property name="companyName">  
  3. <value>lizjason</value>  
  4. </property>  
  5. <constructor-arg>  
  6. <ref bean="orderDAO">  
  7. </constructor-arg>  
  8. </bean>  

上記のプログラムは、簡略化された形式で書き直すことができます.

  
  
  
  
  1. <bean id="orderService" class="com.lizjason.spring.OrderService">  
  2. <property name="companyName" value="lizjason"/>  
  3. <constructor-arg ref="orderDAO"/>  
  4. </bean> 

簡略化されたフォーマットは1.2バージョンで使用できますが、は存在しません.この簡略化されたフォーマットは、コード入力量を少なくするだけでなく、XMLの構成をより明確にすることができます.プロファイルにbean定義が多数存在する場合、読みやすさを大幅に向上させることができます.4.indexではなくtypeを使用してコンストラクション関数パラメータのマッチング問題を解決します.コンストラクション関数に同じタイプのパラメータが複数ある場合、Springは0から始まるindexまたはvalueラベルを使用してこの問題を解決することを許可します.次の例を見てください.

  
  
  
  
  1. <bean id="billingService" class="com.lizjason.spring.BillingService">  
  2. <constructor-arg index="0" value="lizjason"/>  
  3. <constructor-arg index="1" value="100"/>  
  4. </bean> 

上記の方法の代わりにtypeプロパティを使用することが望ましい.

  
  
  
  
  1. <bean id="billingService" class="com.lizjason.spring.BillingService">  
  2. <constructor-arg type="java.lang.String" value="lizjason"/>  
  3. <constructor-arg type="int" value="100"/>  
  4. </bean> 

indexを使用すると、冗長性を少し減らすことができますが、エラーが発生しやすく、type属性ほど読み取り可能ではありません.コンストラクション関数にパラメータ競合がある場合にのみindexを使用する必要があります.5.可能な限り、bean定義Springを多重化することは、構成情報の重複を低減し、XML構成をより簡単にするために、継承と同様のメカニズムを提供する.1つのサブbeanは、その親beanから構成情報を継承することができ、本質的には、この親beanはそのサブbeanのテンプレートのようなものである.これは、大規模なプロジェクトで使用する必要がある特性です.親beanのabstractプロパティをtrueに設定し、子beanで参照する必要があります.例:

  
  
  
  
  1. <bean id="abstractService" abstract="true" class="com.lizjason.spring.AbstractService">  
  2. <property name="companyName" value="lizjason"/>  
  3. </bean>  
  4.  
  5. <bean id="shippingService" parent="abstractService" class="com.lizjason.spring.ShippingService">  
  6. <property name="shippedBy" value="lizjason"/>  
  7. </bean> 

shippingService beanはabstractService beanのプロパティcompanyNameの値lizjasonを継承します.注意:beanにclassメソッドまたはファクトリメソッドという名前を付けると、このbeanはabstractとしてデフォルト設定されます.6.Antスクリプトのimportsのようにimportを使用するのではなく、ApplicationContextを使用してbeanをアセンブリします.Springのimport要素は、モジュール化beanのアセンブリに非常に役立ちます.例:

  
  
  
  
  1. <beans>  
  2. <import resource="billingServices.xml"/>  
  3. <import resource="shippingServices.xml"/>  
  4. <bean id="orderService" class="com.lizjason.spring.OrderService"/>  
  5. <beans> 

しかし、これらのbeanをXMLにimportsでプリインストールするよりも、ApplicationContextを使用して構成する方が柔軟になり、XML構成の管理が容易になります.ApplicationContextのコンストラクション関数にbean定義配列を次のように渡すことができます.

  
  
  
  
  1. String[] serviceResources =...{"orderServices.xml","billingServices.xml","shippingServices.xml"};  
  2. ApplicationContext orderServiceContext = new ClassPathXmlApplicationContext(serviceResources); 

7.idでbeanを識別するには、idまたは名前をbeanの識別として使用することができます.idでは可読性が悪いが、XMLアナライザに影響してbeanのreferenceを有効にすることができる.XML IDREFコンストレイントでidが使用できない場合は、beanの識別子としてnameを使用できます.XML IDREF制約とは、idがアルファベットで始まる必要がある(またはXMLで名前が付けられた句読点)ことを意味し、後ろにアルファベット、数字、ハイフン、下線、ハイフン、full stops(どのように翻訳すればいいか分からない)ことを意味します.実際のアプリケーションではXML IDREF制約の問題に遭遇することはめったにありません.8.開発段階で依存チェックを使用すると、デフォルトのnone、simple、objects、allの代わりにbeanのdependency-checkプロパティに値を設定できます.そうすると、コンテナが依存有効性のチェックをします.1つのbeanのすべてのプロパティ(またはいくつかのプロパティディレクトリ)が明確に設定されている場合、または自動アセンブリを使用する場合に便利です.

  
  
  
  
  1. <bean id="orderService" class="com.lizjason.spring.OrderService" dependency-check="objects">  
  2. <property name="companyName" value="lizjason"/>  
  3. <constructor-arg ref="orderDAO"/>  
  4. </bean> 

この例では、コンテナは、これらのプロパティがprivitivesではないことを確認するか、collectionsがorderService beanに設定されていることを保証します.すべてのbeanにデフォルトの依存チェックを設定することは可能ですが、このプロパティは一部のbeanのプロパティが設定する必要がないため、あまり使用されません.9.各プロファイルに記述コメントを付けるXMLプロファイルでは、スタックされたコメントではなく、記述idとnameを使用することが望ましい.さらに、ファイルに定義されたbeanを要約できるファイル記述ヘッダを追加すると便利です.もう1つの選択肢は、description要素に説明情報を追加することです.たとえば、description要素を使用する利点の1つは、ツールがこの要素から記述情報を簡単に抽出できることです.

  
  
  
  
  1. <beans>  
  2. <description>  
  3. This file defines billing service  
  4. related beans and it depends on 
  5. baseServices.xml,which provides  
  6. service bean templates...  
  7. </description>  
  8. ...  
  9. </beans> 

10.team membersと変更をコミュニケーションjavaソースコードを変更した後、プロファイルの対応する部分が変更されたことを確認し、この状況をteam membersに通知します.XMLプロファイルもコードであり、プログラムの重要な構成部分ですが、読み取りとメンテナンスが難しいです.ほとんどの時間、XMLプロファイルとjavaコードを同時に見てこそ、何が起こっているのかを知ることができます.11.setter注入と構造関数注入、前者Springを優先的に使用すると、構造関数注入、setter注入、方法注入の3つの注入方式が提供される.一般的には前の2種類を使います.

  
  
  
  
  1. <bean id="orderService" class="com.lizjason.spring.OrderService">  
  2. <constructor-arg ref="orderDAO"/>  
  3. </bean>  
  4.  
  5. <bean id="billingService" class="com.lizjason.spring.BillingService">  
  6. <property name="billingDAO" ref="billingDAO">  
  7. </bean> 

この例ではorderService beanは構造関数注入を用い,BillingService beanはsetter注入を用いた.コンストラクション関数注入はbeanが正しく構築されることを保証することができるが、setter注入はより柔軟で制御しやすく、特にclassに複数の属性があり、それらのいくつかがオプションである場合になおさらである.12.前に説明したように、SpringのApplicationContextはjavaオブジェクトを作成することができますが、すべてのjavaオブジェクトが注入によって作成されるべきではありません.たとえば、ドメインオブジェクトはApplicationContextで作成するべきではありません.Springは優れたフレームワークですが、可読性と操作性を考慮すると、XML構成に基づく構成は多くのbeanを定義する際に面倒になります.遷移依存注入を使用すると、XML構成がより複雑で冗長になります.効率的なIDEを使用する場合、例えばEclipse and IntelliJではjavaコードが読みやすくなり、XMLファイルの結論をXMLがSpringで流行している構成フォーマットであることを維持し、管理することができます.bean定義が多数存在する場合、XMLベースの構成は冗長になり、使いにくくなります.Springは豊富な構成オプションを提供しています.これらのオプションを適切に使用すると、XMLの構成がより明確になりますが、自動アセンブリなどの他のオプションでは、読み取りやメンテナンス性が低下する可能性があります.本明細書で説明したテクニックを参照すると、きれいで読みやすいXMLプロファイルを作成するのに役立つかもしれません.