9章、10章が終わった
ようやく、Grails徹底入門の9章と10章が終わりました。ちゃんと理解しているかどうかは、怪しいですけど、とにかく終わりました。最近余り、時間が取れなくて、進むペースがイマイチです。
内容的には、プラグインに関する事だったのですが、「Grailsの凄さは、プラグインにあるんだろうなぁ」と素人的に、垣間見たそんな内容でした。何となくですが、以前「9〜11章をぜひ先に読んで」って言われたのが、解った気がします。以下は、終わってみての感想ですが、何せ素人なので間違った表現が多いと思いますが、ご勘弁を。
”grails.spring.BeanBuilder”は、XMLファイルでなく、GroovyのDSL?(この表現は不安です)で、ビーン定義出来てしまう事。これは、自分みたいな人間には、直感的で解り易いです。BeanBuilderを使っていて、特に意識はしないですが、クロージャーを引数にして、XMLと最終的に同等にしてくれているんだろうなぁ。便利だなぁと思いました。
自分は、”Spring”その物を使った経験が無いので、比較してどうだ?という思いは無いですが、”BeanBuilder”解りやすくて、いいんでない。と思いました。
”doWithSpring”は、プラグイン定義ファイル(〜GrailsPlugin.groovy)上に存在するクロージャですが、”BeanBuilder”をさらに意識せず使えて、ナイスな感じがしました。”doWithSpring”で、ビーンを定義するだけで、ApplicationContext上にロードされて、簡単にコントローラなどに、インジェクション出来てしまいます。
例えばこんな感じです。
def doWithSpring = { // TODO Implement runtime spring config (optional) //メール送信用ビーン定義(p348) mailSender(org.springframework.mail.javamail.JavaMailSenderImpl){ host = "smtp.xxxxx.xxxxx" //smtpサーバー port = 587 //サーバーポート } //メールメッセージ用ビーン定義(p348) simpleMailMessage(org.springframework.mail.SimpleMailMessage){ from = "xxxxx@xxxxxxx.com" //送信元 } }
”doWithDynamicMethod”は、プラグイン定義ファイル上に存在するクロージャで、動的にメソッドを、コントローラなどのArtefactに追加できます。”doWithSpring”でロードしたビーンはコントローラで、簡単にインジェクションする事が可能です。
例えばこんな感じ
---------コントローラ---------- import org.springframework.mail.SimpleMailMessage class HomeController { //ビーンのインジェクション def mailSender def simpleMailMessage //メールテストアクション(p349) def simpletest = { def message = new SimpleMailMessage(simpleMailMessage) message.to = ["xxxxxx@xxxxxxxx.co.jp"] message.subject = "メール送信テスト" message.text = "メッセージ" try{ //メール送信 mailSender.send(message) render (text:"メールを送信しました") }catch(Exception e){ e.printStackTrace() render (text:"送信エラー。スタックを調べて下さい。") } } }
しかし、コントローラ共通の機能だったら、毎回ビーンをインジェクションしたり、関連するライブラリをインポートしたり、するのは手間なんで、そんな時”doWithDynamicMethod”で、以下の様に、動的に共通機能を実装できてしまいます。
---------プラグイン定義ファイル---------- def doWithDynamicMethods = { ctx -> //コントローラの参照 application.controllerClasses.each{ controllerClass -> // metaClass参照 def mc = controllerClass.metaClass registerControllerProps(mc,ctx) } } //メール送信の実装 def registerControllerProps(mc,ctx){ // sendEmailメッソドの追加 mc.sendEmail = {params -> // SimpleMailMessageのコンストラクタに // コンテキストから取得したsimpleMailMessageビーンをセット def message = new org.springframework.mail.SimpleMailMessage(ctx.simpleMailMessage) if(params.from) message.from = params.from message.to = params.to message.subject = params.subject message.text = params.text try{ // ビーンmailSenderをコンテキストから参照 def sender = ctx.mailSender if(params.encoding) sender.defaultEncoding=params.encoding sender.send(message) }catch(Exception e){ e.printStackTrace() }finally{ return "" } } } ---------コントローラ---------- class HomeController { def mailtest= { def message = "メッセージ" //メール送信(〜GrailsPlugin.groovyのdoWithDynamicMethodで実装) sendEmail( to:["xxxxxxx@xxxxxxxxx.co.jp"] ,subject:"sendEmailのテスト" ,text:message ,encoding:"iso-2022-jp") render(text:"メールを送信しました sendEmail") } }
上記とは別に、動的に追加した、メソッドにはリロード処理が必要になってきます。
これらプラグインのパワーを、早く使いこなせる様になりたいです。