Topics
Enterprise Architecture
Springのための宣言的キャッシングサービス
Pages: 1, 2, 3, 4
このコンフィグレーション方法は単純なので、非常に簡単にセットアップできます。キャッシングサービスのコンフィグレーションは、 proxy 要素の内部で実行されます。このproxy要素は、Springの管理下にある1つのBeanへの参照を持っています。参照先のBeanのIDを、 refId 属性として与える必要があります。また、キャッシングサービスを適用するためにインターセプトするメソッドを選択する必要があります。 caching 要素と flushing 要素は、データのキャッシングをトリガするメソッドと、キャッシュのフラッシングをトリガするメソッドをそれぞれ指定しています。この2つの要素は、インターセプトするメソッドの名前を指定した methodName 属 性を提供します。これらの要素には、その他に各キャッシュプロバイダ固有の属性があります。これらの属性は、特定のキャッシュによって、キャッシュと キャッシュフラッシングがどのように実行されるかを指定します。以下の例は、Coherenceを使用したBeanごとのコンフィグレーションを示してい ます。
<bean id="
customerDaoTarget"
class="org.springmodules.cache.samples.dao.CustomerDao" />
<!-- Properties -->
</bean>
<coherence:proxy id="customerDao" refId="
customerDaoTarget">
<coherence:caching methodName="load"
cacheName="customerCache" />
<coherence:flushing methodName="update"
cacheNames="customerCache" when="after" />
</coherence:proxy>
キャッシュ関連のXML要素はすべて、選択したキャッシュプロバイダのネームスペースに限定する必要があります。この例では、キャッシングサービスが、「customerCache」という名前のCoherenceキャッシュに、 CustomerDao.loadメソッドの戻り値を保存するように設定しています。また、 CustomerDao.updateメソッドの実行後に、同じ名前のキャッシュをフラッシュするように設定しています。 CustomerDaoに依存するBeanを設定するには、元々のBeanのIDではなく、 proxy 要素のIDを使用する必要がある点に注意してください。
<bean id="customerManager"
class="org.springmodules.cache.samples.business.CustomerManager"/>
<property name="customerDao" ref="
customerDao" />
</bean>
別の方法として、 proxy 要素の内部で、Beanの定義を宣言することもできます。その結果、コンフィグレーションがよりコンパクトになります。
<coherence:proxy id="customerDao">
<bean
class="org.springmodules.cache.samples.dao.CustomerDao" />
<!-- Properties -->
</bean>
<coherence:caching methodName="load"
cacheName="customerCache" />
<coherence:flushing methodName="update"
cacheNames="customerCache" when="after" />
</coherence:proxy>
Beanごとのコンフィグレーションは、キャッシングサービスをセットアップするための簡単な方法を提供します。Beanごとに beanRef 要素を定義する必要があるので、キャッシングサービスを適用するオブジェクトの数が少ないアプリケーションの場合は、この方法が適しています。
Beanごとのコンフィグレーションは、キャッシングサービスを設定するための直接的な方法を提供します。しかし、アプリケーションが、 Springの管理下にあるBeanを非常にたくさん含んでいる場合は、コンフィグレーション関連のXMLが大量になり過ぎて行き詰ってしまいます。コン フィグレーションを簡素化するために、アプリケーションを ソースレベルのメタ属性で修飾して、キャッシングサービスを適用するためにインターセプトするメソッドを指定することができます。宣言的キャッシングは、 Commons Attributesと J2SE 5.0注釈をサポートしています。
Commons Attributesを利用すると、J2SE 1.4以前を使用したアプリケーションにメタ属性を付加できます。Javaコンパイラは、この種のメタ属性を認識しないので、特別なコンパイル処理が必要 になります。Commons Attributesメタデータをコンパイルすると、アプリケーションのソースファイルと一緒にコンパイルしなければならないソースコードが生成されま す。Commons AttributesメタデータをサポートするIDEは存在しません。これは、 refactoringのような一般的なソフトウェア開発プラクティスがサポートされていないのと同じです。以下の例は、Commons Attributesの使用を示しています。このコンフィグレーションは、前のセクションのコンフィグレーションと等価です。
public class CustomerDao {
/**
* @@Cached(modelId="
cachingModel")
*/
public Customer load(long customerId) {
// method implementation
}
/**
* @@FlushCache(modelId="
flushingModel")
*/
public void update(Customer customer) {
// method implementation
}
// rest of class implementation
}
ソースレベルのメタデータ属性は、キャッシングサービスの動作方法を記述するのではなく、キャッシングサービスを適用するかどうかを記述することだけに限定されます。キャッシングサービスの動作は、Spring IoCコンテナで記述します。この例のメタデータは、 cachingModelというIDを持つモデルで指定された設定に従って、 CustomerDao.loadメ ソッドの戻り値をキャッシュすることのみを示しています。Spring IoCコンテナで宣言されているモデルには、キャッシュ固有の設定が含まれており、ここに、値をキャッシュに保存する方法が記述されています。同じルール がキャッシュフラッシングにも適用されます。メタデータ属性によって参照されるモデルの宣言は、以下のとおりです。
<coherence:commons-attributes>
<coherence:caching id="
cachingModel"
cacheName="customerCache" />
<coherence:flushing id="
flushingModel"
cacheNames="customerCache" when="after" />
</coherence:commons-attributes>
<bean id="customerDao"
class="org.springmodules.cache.samples.dao.CustomerDao" />
<!-- Properties -->
</bean>
cachingModelというIDを持つモデルは、「customerCache」という名前のCoherenceキャッシュにオブジェクトを保存することを示しています。同様に、 flushingModelというIDを持つモデルは、インターセプトしたメソッドが実行された後に、同じ名前のキャッシュがフラッシュされることを示しています。キャッシュプロバイダに関連するどんな変更も、Spring IoCコンテナの中 だけで 実行され、キャッシュ関連のメタデータ属性には影響を与えません。このような変更には、Javaソースコードの再コンパイルは必要ありません。キャッシュ 関連のメタデータを処理するには、Springコンテナの中で、ソースレベルのメタデータで修飾されたクラス(この例では、 customerDaoというBean)のインスタンスを宣言する必要があります。
J2SE 5.0の注釈は、アプリケーションにメタデータ属性を付加するための、より構造化された書式です。注釈は組み込みの言語機能のため、Javaコンパイラは 注釈を別の言語構成要素として識別するので、Commons Attributesのような問題は発生しません。J2SE 5.0注釈を使用したキャッシングサービスのコンフィグレーションは、Commons Attributesを使用したコンフィグレーションとほとんど同じです。実際には、Javaのソースコードの数行を置き換えるだけです。
public class CustomerDao {
@Cacheable(modelId = "
cachingModel")
public Customer load(long customerId) {
// method implementation
}
@CacheFlush(modelId = "
flushingModel")
public void update(Customer customer) {
// method implementation
}
// rest of class implementation
}
J2SE 5.0注釈の詳細については、 JDK 1.5ドキュメントを参照してください。Spring IoCコンテナで、Commons AttributesをJ2SE 5.0注釈に切り替えるには、 commons-attributes要素を annotations要素に置き換えるだけです。
<coherence:annotations>
<coherence:caching id="
cachingModel"
cacheName="customerCache" />
<coherence:flushing id="
flushingModel"
cacheNames="customerCache" when="after" />
</coherence:annotations>
<bean id="customerDao"
class="org.springmodules.cache.samples.dao.CustomerDao" />
<!-- Properties -->
</bean>
ソースレベルメタデータを使用したキャッシングサービスは、Spring IoCコンテナ内で一度だけセットアップします。後は、特別なコンフィグレーションなしに、いくらでもBeanを追加できます。キャッシングサービスをた くさんのオブジェクトに適用する必要がある場合は、ソースレベルのメタデータ属性によるコンフィグレーションが理想的なソリューションです。