<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>ColdSpring ATOM - 気楽に行こう</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/" />
   <link rel="self" type="application/atom+xml" href="http://www.schwarzmond.info/blog/cat10/categoryatom.xml" />
   <id>tag:www.schwarzmond.info,2009:/blog//1</id>
   <updated>2008-11-05T02:57:21Z</updated>
   <subtitle>いろんなネタを書くかもなので、興味のあるネタ以外がうざい人は、カテゴリリンクの RSS を見てください。</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.33-ja</generator>

<entry>
   <title>CF Frameworks Explorer ってなんぞ？</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/11/cf_frameworks_explorer.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.105</id>
   
   <published>2008-11-05T02:43:35Z</published>
   <updated>2008-11-05T02:57:21Z</updated>
   
   <summary>CFEclipse を導入する際に、ずっと気になっていたけど、 こんな風だし、 ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="フレームワーク" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>CFEclipse を導入する際に、ずっと気になっていたけど、</p>

<p><img alt="cfframeworks01.gif" src="http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks01.gif" width="261" height="117" style="border: 1px solid gray;" /></p>

<p>こんな風だし、</p>

<p><img alt="cfframeworks02.gif" src="http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks02.gif" width="297" height="62" style="border: 1px solid gray;" /></p>

<p>右クリックで、“構成”を選択すると、</p>

<p><img alt="cfframeworks03.gif" src="http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks03.gif" width="441" height="142" /></p>

<p>こんな警告出るし、</p>

<p><a href="http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks04.html" onclick="window.open('http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks04.html','popup','width=548,height=317,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.schwarzmond.info/blog/img_coldfusion/cfframeworks04-thumb.gif" width="300" height="173" alt="" /></a></p>

<p>こんなウィンドウが表示されるだけで、なんなんだよ、これ。って感じで、放置していた CF Frameworks Explorer 。</p>

<p>でも、<a href="http://cfeclipse.org/cfeclipsetv.cfm">ここ</a> の「08 CF Frameworks Explorer Introduction」を見て、一気に解決。</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/11/cf_frameworks_explorer.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>Railo 浮上</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/09/railo_1.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.93</id>
   
   <published>2008-09-22T04:20:19Z</published>
   <updated>2008-09-22T04:24:53Z</updated>
   
   <summary>以前のエントリーで、Railo に見事撃沈された我がサンプルアプリケーション。 ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p><a href="http://www.schwarzmond.info/blog/2008/06/railo.html">以前のエントリー</a>で、Railo に見事撃沈された我がサンプルアプリケーション。<br />
その Railo が正式リリースされたと聞いたので、もう一度、動作確認してみた。<br />
</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/09/railo_1.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>ColdSpring の Remote Facades</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/06/coldspring_remote_facades.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.81</id>
   
   <published>2008-06-06T00:33:30Z</published>
   <updated>2008-06-06T00:37:03Z</updated>
   
   <summary>ColdSpring のドキュメントに Remote Facades という項目...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>ColdSpring のドキュメントに Remote Facades という項目がある。<br />
これも確か、デザインパターンで見たような気がする。<br />
<a href="http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?RemoteFacade">便利なサイト</a>があったので、参考にさせてもらった。ありがたい。<br />
なるほどなるほど。<br />
実際の実装には<a href="http://andyjarrett.co.uk/andy/blog/index.cfm/2008/5/19/ColdSpring-and-Remote-Facades">ここ</a>を参考にさせてもらった。</p>

<p>で、とりあえず、http://localhost/shopping/model/ItemArrayBean.cfc?method=getItemArray にアクセス。</p>

<p><em>コンポーネント [[リポジトリ]]\shopping\www\model\ItemArrayBean.cfc のメソッド 'getItemArray' はリモートでアクセスできません。  </em></p>

<p>cffunction の access 属性が public なのだから当然。</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/06/coldspring_remote_facades.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>ちょっと楽になるかな？ツール</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/06/post_42.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.79</id>
   
   <published>2008-06-04T00:50:09Z</published>
   <updated>2008-06-04T02:11:07Z</updated>
   
   <summary>もともと、無精なものだから、どうにも Transfer の Generated ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>もともと、無精なものだから、どうにも Transfer の Generated Methods の入力が煩わしい。<br />
多少でも楽になればと思い、ちょっとツールを作ってみた。<br />
<a href="http://www.schwarzmond.info/blog/img_coldfusion/developing.zip">これ</a>を使えば、<br />
<img alt="developing_04.gif" src="http://www.schwarzmond.info/blog/img_coldfusion/developing_04.gif" width="238" height="251" style="border:1px solid gray;" /><br />
こういう風に、一覧で利用できる関数を表示してくれる。</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/06/post_42.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>Observer を Inject する</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/06/observer_inject.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.78</id>
   
   <published>2008-06-03T00:40:13Z</published>
   <updated>2008-06-03T00:44:57Z</updated>
   
   <summary>Google Groups に参考になるスレッドが上がってた。 addXXXOb...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>Google Groups に参考になるスレッドが上がってた。<br />
<a href="http://groups.google.co.jp/group/transfer-dev/browse_thread/thread/7ae52b140ee1a7bd#">addXXXObserver(component), where to call? is singleton required?</a><br />
そこからのリンク<a href="http://www.silverwareconsulting.com/index.cfm/2008/5/21/My-Take-on-Transfer-ORM-Event-Model-Examples--BeforeCreate-Example">My Take on Transfer ORM Event Model - BeforeCreate Example</a> 。<br />
Observer の登録の仕方だ。これを参考にすると、すっきりした。<br />
</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/06/observer_inject.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>ＸＭＬの設定ファイルの豆知識</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/05/post_41.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.73</id>
   
   <published>2008-05-27T00:32:14Z</published>
   <updated>2008-05-27T00:35:44Z</updated>
   
   <summary>ところでいくつかあるＸＭＬの設定ファイルで、どうするのかなぁと感じていたことがあ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>ところでいくつかあるＸＭＬの設定ファイルで、どうするのかなぁと感じていたことがある。<br />
特定のディレクトリを絶対パスで指定したい場合に、配置するサーバーの状態によっては、ディレクトリ名を変えないといけないこともあるだろう。そうしたときに、ＸＭＬ内の該当箇所を全て置き換えていかないといけないのかなぁ。とちょっと不便に思っていた。</p>

<p>ところが、<a href="http://www.leavethatthingalone.com/projects/CFCPhotoBlog/">ここ</a>のソースを見て解決した。<br />
要は、ColdFusion レベルの手法ではなく、ＸＭＬレベルの手法で解決すればいいのだ。<br />
</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/05/post_41.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>Model-Glue の初期設定</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/05/modelglue_2.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.71</id>
   
   <published>2008-05-26T01:22:56Z</published>
   <updated>2008-05-26T01:26:21Z</updated>
   
   <summary>ここらで、基本的なところに戻って、ColdSpring.xml の先頭にある、 ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>ここらで、基本的なところに戻って、ColdSpring.xml の先頭にある、<br />
&lt;bean id="modelGlueConfiguration" class="ModelGlue.unity.framework.ModelGlueConfiguration"&gt;<br />
を見ていこう。</p>

<p>ここでは、Model-Glue の各種設定項目を、ＤＩコンテナである ColdSprng で設定しているということになる。<br />
設定できる項目は、以下の通り。</p>]]>
            <a href="http://www.schwarzmond.info/blog/2008/05/modelglue_2.html">続く...</a>
      
   </content>
</entry>
<entry>
   <title>Transfer のトランザクション処理</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/05/transfer_4.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.59</id>
   
   <published>2008-05-13T00:54:03Z</published>
   <updated>2008-10-10T02:05:27Z</updated>
   
   <summary>サンプルアプリケーションは、データベースのトランザクション処理ができていない。 ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Transfer" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>サンプルアプリケーションは、データベースのトランザクション処理ができていない。<br />
こんなアプリケーションが許されるわけはないので、トランザクションを実装しなければならない。<br />
トランザクションはどのように実装するのか。</p>

<p>やり方としては、コンポーネント内の指定した関数を丸ごとトランザクション処理するというイメージになる。<br />
shopping.model.CartProcess の transfer.TransferFactory を AutoWire したタイミングで、transfer.TransferFactory から transfer.com.sql.transaction.Transaction を取得する。<br />
<quote><br />
&lt;cffunction name="setOrmService" access="public" returntype="void" output="false"&gt;<br />
　&lt;cfargument name="ormService" type="transfer.TransferFactory" required="true"&gt;<br />
　&lt;cfset variables.transfer = arguments.ormService.getTransfer() /&gt;<br />
　&lt;cfset variables.transaction = arguments.ormService.getTransaction() /&gt;<br />
&lt;/cffunction&gt;<br />
</quote></p>

<p>その Transaction を利用して、<br />
<quote><br />
　&lt;cfset transaction.execute(component, methodName, [arguments]) /&gt;<br />
</quote><br />
と、直接的に関数をトランザクション指定で起動することもできる。<br />
直接指定の場合は、その関数を利用するときに、上記の記述で利用することになる。</p>

<p>また、ＡＯＰのように記述して、関数を指定することで、指定した関数が丸ごとトランザクション処理されるようだ。<br />
この記述の場合は、事前に行っておくことで、その関数を通常のように利用した場合でも、トランザクション処理されることになる。<br />
<quote><br />
&lt;cffunction name="setOrmService" access="public" returntype="void" output="false"&gt;<br />
　&lt;cfargument name="ormService" type="transfer.TransferFactory" required="true"&gt;<br />
　&lt;cfset variables.transfer = arguments.ormService.getTransfer() /&gt;<br />
　&lt;cfset variables.transaction = arguments.ormService.getTransaction() /&gt;<br />
　&lt;cfset variables.transaction.advise(this, insertItem) /&gt;<br />
&lt;/cffunction&gt;<br />
</quote><br />
さらに、<br />
<quote><br />
　&lt;cfset arguments.transaction.advise(this, "^save") /&gt;<br />
</quote><br />
と、正規表現で一括してトランザクション処理指定もできる。<br />
トランザクションで処理したい関数を save で始まる関数名にしておけば、簡単に一括指定できる。<br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>ＡＯＰの実装</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/05/post_39.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.52</id>
   
   <published>2008-05-01T00:42:02Z</published>
   <updated>2008-10-10T02:07:21Z</updated>
   
   <summary>では、どのようにＡＯＰを実装するのかを見ていく。 前回のログを書き出すコードとし...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>では、どのようにＡＯＰを実装するのかを見ていく。</p>

<p>前回のログを書き出すコードとして拝借したファイルは、LogginAroundAdvice.cfc と LoggingService.cfc の２つ。<br />
LoggingService.cfc は、ログを書き出すだけのコンポーネント。<br />
LogginAroundAdvice.cfc は、ログの機能を追加しようとしている関数に対して、どういうタイミングでログを書き出すかを<br />
指定（Advice）するためのコンポーネント。</p>

<p>Advice という用語が出てきた。これが実にわかりにくい。<br />
今でも、はっきりわかっていない。おぼろげな認識では、<br />
“どういう機能（ログ書き出し）をどのタイミング（前、後、前後、エラー時）で提供”するかということだろうか。<br />
そして、Advisor というものもある。その Advice を“どういうものに付け加えるかを指定”するとでも言うのだろうか。<br />
ドキュメントの英文を読んでも、ピンと来ないし、困ったものだ。</p>

<p><quote><br />
　&lt;bean id="loggingService" class="shopping.model.aop.component.LoggingService" /&gt;<br />
　<br />
　&lt;bean id="loggingAdvice" class="shopping.model.aop.aspects.LoggingAroundAdvice"&gt;<br />
　　&lt;property name="loggingService"&gt;<br />
　　　&lt;ref bean="loggingService"&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
　<br />
　&lt;bean id="loggingAdvisor" class="coldspring.aop.support.NamedMethodPointcutAdvisor"&gt;<br />
　　&lt;property name="advice"&gt;<br />
　　　&lt;ref bean="loggingAdvice" /&gt;<br />
　　&lt;/property&gt;<br />
　　&lt;property name="mappedNames"&gt;<br />
　　　&lt;value&gt;*&lt;/value&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
ColdSpring.xml で、このように設定する。<br />
loggingService という Bean を設定し、その機能を AroundAdvice する loggingAdvice を設定。<br />
任意の関数名で処理を織り込む（Weave）loggingAdvisor を設定。</p>

<p>これにより、ログ機能（shopping.model.aop.component.LoggingService）をＡＯＰで利用するための準備が整う。</p>

<p>前回の<br />
<quote><br />
　&lt;bean id="shopping" class="coldspring.aop.framework.ProxyFactoryBean"&gt;<br />
　　&lt;property name="target"&gt;<br />
　　　&lt;ref bean="cartProcessTarget" /&gt;<br />
　　&lt;/property&gt;<br />
　　&lt;property name="interceptorNames"&gt;<br />
　　　&lt;list&gt;<br />
　　　　&lt;value&gt;loggingAdvisor&lt;/value&gt;<br />
　　　&lt;/list&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
で、bean id="shopping" に引数 interceptorNames で渡している loggingAdvisor が上記の設定でできるのである。</p>

<p><a href="http://www.schwarzmond.info/blog/shopping-aop_20080501.zip">サンプルアプリケーション</a><br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>ColdSpring によるＡＯＰ（Aspect Oriented Programming）</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/04/coldspring_aspect_oriented_pro.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.51</id>
   
   <published>2008-04-30T01:34:48Z</published>
   <updated>2008-10-10T02:07:33Z</updated>
   
   <summary>ColdSpring のＤＩコンテナとセットで、ＡＯＰというものが解説されること...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>ColdSpring のＤＩコンテナとセットで、ＡＯＰというものが解説されることがある。<br />
これも、たくさん記述があるので、それを読んでみても、何がどう便利でどう簡単なのかが、ピンと来ない。<br />
というわけで、実践。</p>

<p><a href="http://cdscott.blogspot.com/2005/10/coldspring-aop-tutorial-part-one.html">ColdSpring AOP Tutorial - Part One</a>とか、<a href="http://www.coldspringframework.org/docs/">ColdSpring ドキュメント</a>や、ColdSpring のサンプルからちょっとコードを拝借。</p>

<p>ログを書き出す機能を、これまでのアプリケーションに、ＡＯＰ手法で実装してみる。</p>

<p>とりあえず、どれぐらい簡単なのかを確認するために、ログ機能を利用するための諸設定などは、すでに行われているものとすれば、実に、簡単である。</p>

<p>やろうとしていることは、shopping.model.CartProcess コンポーネントの関数を実行するたびに、ログを書き出すようにしたい。<br />
ということで、それには、ColdSpring.xml の中の、<br />
<quote><br />
　&lt;bean id="shopping" class="shopping.model.CartProcess" autowire="byType" /&gt;<br />
</quote><br />
これを</p>

<p><quote><br />
　&lt;bean id="cartProcessTarget" class="shopping.model.CartProcess" autowire="byType" /&gt;<br />
　<br />
　&lt;bean id="shopping" class="coldspring.aop.framework.ProxyFactoryBean"&gt;<br />
　　&lt;property name="target"&gt;<br />
　　　&lt;ref bean="cartProcessTarget" /&gt;<br />
　　&lt;/property&gt;<br />
　　&lt;property name="interceptorNames"&gt;<br />
　　　&lt;list&gt;<br />
　　　　&lt;value&gt;loggingAdvisor&lt;/value&gt;<br />
　　　&lt;/list&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
とするだけである。<br />
が、実際、簡単なんだと思えるまで、結構時間がかかった。</p>

<p>２段階でコンポーネントのインスタンスを取得していることになる。<br />
こうして得られる shopping インスタンスは、coldspring.aop.framework.ProxyFactoryBean ではなく、<br />
あたかも shopping.model.CartProcess そのもののように、扱うことができる。</p>

<p>そして、shopping 上の関数を利用すると、ログ書き出しが機能してしまうのである。<br />
既存の shopping.model.CartProcess のコードを書き換えることなく、機能追加を実装できてしまった。</p>

<p>いやいや、ログを取る場合は、もっと細かいレベルで、見たいのではないかと。<br />
例えば、shopping.model.CartProcess の関数は、「カートに商品を入れる」というものであり、<br />
このログ機能が処理されるタイミングは、shopping.model.CartProcess の関数が実行される前、後、その両方、<br />
そして、エラーが発生した場合で設定できる。<br />
既存の関数にログをはき出す機能を付けても、それでは、たいした効果は期待できない。</p>

<p>ＡＯＰとは、再利用可能でシンプルな見やすいプログラムを作ることが目的の一つになっている。<br />
例えば、データベースに対して、引数で与えたＳＱＬ文を発行するだけというような、再利用できる低レベルでの関数であれば、<br />
その関数の前後などで、ログを書き出すことは、意味を持ってくるのだろう。</p>

<p>また、ログに限らず、ＡＯＰは、トランザクション処理や、キャッシュ処理、権限チェック処理などが利用例としてあげられており、どのようなものを実装するかで、意義は変わってくるのだろう。<br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>AutoWire</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/04/autowire.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.48</id>
   
   <published>2008-04-24T01:17:01Z</published>
   <updated>2008-10-10T02:08:15Z</updated>
   
   <summary>さて、たびたび出てきた AutoWire とは、何か。 ColdSpring の...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>さて、たびたび出てきた AutoWire とは、何か。<br />
ColdSpring のドキュメントによると、<br />
<quote><br />
The term "autowire" refers to the ability of the ColdSpring beanFactory to automatically wire dependent objects together without necessarily having to define those dependencies in the xml bean definitions.<br />
</quote><br />
とある。<br />
簡単に言うと・・・、説明は止めておこう。実際に、どのように動くのかを見た方がわかりやすい。<br />
検索すれば、AutoWire も、いっぱい出てくる。もちろん、ColdSpring での情報は少ないが。</p>

<p>前回、<br />
<quote><br />
　&lt;bean id="shopping" class="shopping.model.CartProcess"&gt;<br />
　　&lt;property name="itemAB"&gt;<br />
　　　&lt;ref bean="itemArrayBean" /&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
このような記述をした。<br />
ColdSpring.xml の Bean は、基本的にリクエストごとに、初期化される。<br />
shopping.model.CartProcess を初期化する際に、setItemAB 関数を探して、引数として、itemAB という名前で、itemArrayBean を<br />
渡して処理しなさいということであった。</p>

<p>AutoWire を使えば、この記述が以下のように簡単になる。<br />
<quote><br />
　&lt;bean id="shopping" class="shopping.model.CartProcess" autowire="byName" /&gt;<br />
</quote></p>

<p>autowire="byName" をautowire="byType" とすることもできる。<br />
要するに、Bean を受け取りたい側（この場合は、CartProcess.cfc）で、setter 関数を記述さえすれば、取得できるわけである。</p>

<p>byName と、byType は、どう違うのか。名前と型なわけで、全く違うわけだが、byName であれは、setItemAB と名前で探すのに対し、<br />
<quote><br />
&lt;bean id="shopping" class="shopping.model.CartProcess" autowire="byType" /&gt;<br />
</quote><br />
<quote><br />
&lt;cfargument name="itemArrayBean" type="shopping.model.ItemArrayBean" /&gt;<br />
</quote><br />
byType の場合は、setter 関数の名前は set で始まっていればよく、引数の受取の型指定が一致しているものを探すわけである。</p>

<p>同じ型で複数の Bean を作りたい場合には、byName にすることになるだろう。<br />
byTypeの方は、すでに setter 関数があって、名前が重複してしまった場合などに利用することになるだろう。</p>

<p>基本的には、好みで決めればいいのだろう。byType の方が、好みだ。<br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>ColdSpring で Bean へデータを渡す</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/04/coldspring_bean.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.46</id>
   
   <published>2008-04-23T01:01:21Z</published>
   <updated>2008-10-10T02:08:42Z</updated>
   
   <summary>では、コントローラーではないコンポーネントに ColdSpring の Bean...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>では、コントローラーではないコンポーネントに ColdSpring の Bean を渡すには、どうすればよいのか。<br />
ロジックの、CartProcess.cfc に itemArrayBean を渡す方法を考えてみよう。</p>

<p>bean タグは、子要素に、constructor-arg と、property を持つことができる。<br />
constructor-arg は、コンストラクタの引数として渡すためのタグ。<br />
property は、setter 関数で渡すためのタグとなっている。</p>

<p><quote><br />
　&lt;bean id="shopping" class="shopping.model.CartProcess"&gt;<br />
　　&lt;constructor-arg name="itemAB"&gt;<br />
　　　&lt;ref bean="itemArrayBean" /&gt;<br />
　　&lt;/constructor-arg&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
と ColdSpring.xml に記述してやることによって、CartProcess.cfc の初期化の際に、引数で自動的に渡してくれるのである。<br />
初期化の関数は、デフォルトで、init になっているようで、</p>

<p><quote><br />
　&lt;cffunction name="init" returntype="any" access="public" output="false"&gt;<br />
　　&lt;cfargument name="itemAB" required="true"&gt;<br />
　　&lt;cfset variables.itemArray = arguments.itemAB.getItemArray() /&gt;<br />
　　&lt;cfreturn this /&gt;<br />
　&lt;/cffunction&gt;<br />
</quote><br />
という記述を、CartProcess.cfc にしてやると、CartProcess.cfc 上で、いつでも商品リストデータが利用可能になる。</p>

<p>一方、<br />
<quote><br />
　　&lt;constructor-arg name="itemAB"&gt;<br />
　　　&lt;ref bean="itemArrayBean" /&gt;<br />
　　&lt;/constructor-arg&gt;<br />
</quote><br />
を、<br />
<quote><br />
　　&lt;property name="itemAB"&gt;<br />
　　　&lt;ref bean="itemArrayBean" /&gt;<br />
　　&lt;/property&gt;<br />
</quote><br />
とすると、自動的に、CartProcess.cfc にある、setItemAB という関数を探して itemArrayBean を渡してくれるのである。</p>

<p>再び、サンプルアプリケーションを作ってみた。<br />
できることは同じであるが、ColdSpring を利用して、コントローラーへ、自動的に、データを渡している。</p>

<p><a href="http://www.schwarzmond.info/blog/shopping-coldspring_20080423.zip">サンプルColdSpring</a><br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>ColdSpring</title>
   <link rel="alternate" type="text/html" href="http://www.schwarzmond.info/blog/2008/04/coldspring.html" />
   <id>tag:www.schwarzmond.info,2008:/blog//1.45</id>
   
   <published>2008-04-22T01:19:49Z</published>
   <updated>2008-10-10T02:08:54Z</updated>
   
   <summary>ColdSpring を活用してみよう。 すでに ColdSpring の機能で...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ColdFusion" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ColdSpring" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Model-Glue" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.schwarzmond.info/blog/">
      <![CDATA[<p>ColdSpring を活用してみよう。<br />
すでに ColdSpring の機能である、“ＤＩ”というものについての記述は、たくさんあるので、どのように使うかを見ていく。<br />
よい題材が思いつかなかったので、Common.cfc で生成していた商品リストを「強引に」ColdSpring でやってみよう。<br />
ColdSpring.xml に下記のように記述する。<br />
<quote><br />
　&lt;bean id="itemArrayBean" class="shopping.model.ItemArrayBean"&gt;<br />
　　&lt;property name="itemArray"&gt;<br />
　　　&lt;list&gt;<br />
　　　　&lt;map&gt;<br />
　　　　　&lt;entry key="name"&gt;&lt;value&gt;光学式マウス&lt;/value&gt;&lt;/entry&gt;<br />
　　　　　&lt;entry key="price"&gt;&lt;value&gt;2600&lt;/value&gt;&lt;/entry&gt;<br />
　　　　&lt;/map&gt;<br />
　　　　&lt;map&gt;<br />
　　　　　&lt;entry key="name"&gt;&lt;value&gt;ボール式マウス&lt;/value&gt;&lt;/entry&gt;<br />
　　　　　&lt;entry key="price"&gt;&lt;value&gt;1100&lt;/value&gt;&lt;/entry&gt;<br />
　　　　&lt;/map&gt;<br />
　　　　&lt;map&gt;<br />
　　　　　&lt;entry key="name"&gt;&lt;value&gt;レーザー式マウス&lt;/value&gt;&lt;/entry&gt;<br />
　　　　　&lt;entry key="price"&gt;&lt;value&gt;4800&lt;/value&gt;&lt;/entry&gt;<br />
　　　　&lt;/map&gt;<br />
　　　&lt;/list&gt;<br />
　　&lt;/property&gt;<br />
　&lt;/bean&gt;<br />
</quote><br />
ここで注意しなければならないのは、Model-Gule は、ColdSpring.xml などのファイルを、ＯＳのデフォルトエンコーディングを前提に<br />
読み込んでいるらしく、Windows で動作させる場合は、Shift_JIS で保存しなければ、文字化けしてしまった。<br />
<quote><br />
　&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
</quote><br />
としても、だめだった。他のＯＳでは試していないので、あくまで、推測である。<br />
自動で判別してくれるとか、先頭行をチェックしてから読み込むということは、してくれないようである。</p>

<p>shopping.model.ItemArrayBean は、商品リストデータを保持するコンポーネント。<br />
Java でいうところの、Bean ということになる。ColdSpring でも、この Bean という単語を採用している。<br />
デフォルトでは、リクエストごとに、インスタンスが生成されているようだ。<br />
固定値を保持するような Bean は、アプリケーションで１インスタンスでいいのだから、何かしら、やり方があるのだろうか。<br />
singleton とかの記述もマニュアルにあるし、できそうな雰囲気もあるが、試していない。</p>

<p>では、実際に、これを利用するためには、どうすればよいのか。<br />
コントローラーでは、非常に簡単に利用できる。<br />
getModelGlue().getBean("itemArrayBean") これだけで、取得できてしまうのである。<br />
Controller.cfc にある、onRequestStart 関数に<br />
&lt;cfset variables.itemArrayBean = getModelGlue().getBean("itemArrayBean") /&gt; とすれば、Controller.cfc 上では、いつでも、利用可能になる。</p>

<p>また、あたかも、AutoWire のように、<br />
<quote><br />
　&lt;cffunction name="setItemArrayBean" access="public" returnType="void" output="false"&gt;<br />
　　&lt;cfargument name="itemArrayBean" type="any"&gt;<br />
　　&lt;cfset variables.itemArrayBean = arguments.itemArrayBean /&gt;<br />
　&lt;/cffunction&gt;<br />
</quote><br />
としてやるだけでも、取得できてしまう。<br />
「あたかも、AutoWire のように」としたのは、ColdSpring.xml の bean タグに、AutoWire の設定することなく、<br />
setter 関数が処理されたためにこのような表現をした。コントローラーは、本当に特別なもののようだ。<br />
AutoWire については、また、後日、読み解いてみたい。<br />
</p>]]>
      
   </content>
</entry>

</feed>
