GrailsでSpringをGroovyにしよう!

1,756
-1

Published on

JSUG+JGGUG合同勉強会
2009年6月24日

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,756
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

GrailsでSpringをGroovyにしよう!

  1. 1. GrailsでSpringを Groovyにしよう! JSUG+JGGUG合同勉強会 2009年6月24日 def speaker = new Cast(name:”T.Yamamoto”,version:”JSG2UG-2009-06-24”)
  2. 2. 自己紹介 名前:山本 剛 (やまもとつよし) 所属:株式会社ニューキャスト 組版屋、印刷系Webアプリ開発など。 案件は90%Grailsを使ってます。 JGGUG(じぇいがぐ) 名古屋支部 担当です。 「Grails徹底入門」9-11章を書きました。 Grails Acegi Plugin作った人。 ブログ http://d.hatena.ne.jp/mottsnite/
  3. 3. おさらい
  4. 4. Grailsとは? よく聞く説明 「Groovyで実装されたRuby on Rails」!?    Java+Groovyで実装された、CoC、DRYの概念を取り 入れた(‘RoR’にインスパイアされた)、Webアプリケーション開発環境。 基礎はSpring,Hibernate等を使用している。 そして、それらをシンプルに活用できる環境。 Grails, the Platform(DGG2引用) 合ってるようで間違い
  5. 5. Grailsの構成図 GrailsGrailsGrails Groovy Spring Hibernate SiteMesh Groovy 基礎部分はJava(+Groovy)基礎部分はJava(+Groovy)基礎部分はJava(+Groovy)基礎部分はJava(+Groovy) JVMJVMJVMJVM Hibernate:ORマッピング Spring: DIコンテナ・多機能なラッパーフレームワーク SiteMesh:レイアウトフレームワーク Jetty: サーブレットコンテナ HSQLDB:ピュアJavaなデータベース 2.5.6 3.3.1 2.4 1.5+ 1.6.3
  6. 6. デモ grails create-app demo cd demo grails create-domain-class Book grails create-controller Book grails run-app 今日はこれやりません
  7. 7. 本日のテーマ! GrailsとSpringの関係 ∼BeanBuilderへたどりつくまで。 BeanBuilder(ビーンビルダ)解説!←本日のメイン GrailsでSpringをGroovyに使う! GrailsにSpringビーンを追加してみる。 SpringでGrailsを使ってGroovyに! applicationContext.groovy !?!? (サンプル解説) GORMをSpringで使う!(サンプル解説) 「GrailsでSpringをGroovyにしよう!」
  8. 8. BeanBuilderって? いろいろ話す前に、まずはザックリこんな感じ。 <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="127.0.0.1"/> </bean> <bean id="mailMessageMe" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="tyam@xmldo.jp"/> </bean> <bean id="mailMessageYou" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="you@xmldo.jp"/> </bean> mailSender(org.springframework.mail.javamail.JavaMailSenderImpl) { host = '127.0.0.1' } def map = ["Me":"tyam@xmldo.jp","You":"you@xmldo.jp"] map.each{k,v-> "mailMessage${k}"(org.springframework.mail.SimpleMailMessage) { from = v } } ダイナミックにしてみたり!
  9. 9. 何故, BeanBuilder !?
  10. 10. GrailsとSpringの関係 今さら言うまでもなく、 Grailsの中はSpringがいっぱい! 基礎をSpringフレームワークが支えています。 Grailsには、Springビーンを簡単に追加する仕組みがあり ます。 → 「GrailsでSpringをGroovyに使う!」で話します。 先ずは関係を知るために簡単な所から見てみましょう。 PROJECT_HOME/src/templates/war/web.xml PROJECT_HOME/web-app/WEB-INF/ applicationContext.xml 手 順 grails create-app demo cd demo grails install-template
  11. 11. src/templates/war/web.xml <web-app version="2.4" ... <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> ... <servlet> <servlet-name>grails</servlet-name> <servlet-class> org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> ... applicationContext! DispatcherServlet!
  12. 12. web-app/WEB-INF/applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ...> <bean id="grailsApplication" class="org.codehaus.groovy.grails.commons.GrailsApplicationFactor yBean"> <description>Grails application factory bean</description> <property name="grailsDescriptor" value="/WEB-INF/grails.xml" /> <property name="grailsResourceLoader" ref="grailsResourceLoader" /> </bean> ... </beans>
  13. 13. applicationContext.xmlの中身 grailsApplication - GrailsApplicationFactoryBean pluginManager - GrailsPluginManagerFactoryBean pluginMetaManager - DefaultPluginMetaManager grailsConfigurator - GrailsRuntimeConfigurator grailsResourceLoader - GrailsResourceLoaderFactoryBean grailsResourceHolder - GrailsResourceHolder characterEncodingFilter - CharacterEncodingFilter
  14. 14. その中で、最も重要なのは、 grailsApplication GrailsApplicationFactoryBean
  15. 15. GrailsApplicationFactoryBean Grailsの最初のバージョンからあります。 GroovyファイルからGrailsアプリケーション用オブジェ クトを生成するファクトリビーン。 リソースが読みこまれ、ここから様々なGrailsオブジェク トが出荷されます。 grailsApplication grails-app以下のgroovyファイル達 grails-app/domin/Book.groovy Author.groovy grails-app/service/SomeService.groovy HogeService.groovy リソースロード ここから様々な情報を読みこんで、 Grailsで使うビーンの生成をしています。
  16. 16. grailsApplicationとビーン生成の関係 この関係を調べることでBeanBuilderって何か解るかも! いろいろソースを探ってたら BeanBuilder誕生の理由?が解った気がしたから・・・ 但し、推測
  17. 17. Grailsの裏側解説(簡易版) groovy groovy groovy groovy groovy groovy groovy groovy grails-appの中 grails起動 リソースロード grailsApplicationに収集 ルールに基づいて情報を読みこむ コンテキスト完成 ビーンが生成される
  18. 18. 歴史をさかのぼると、v0.2時代はGrailsのGroovy(CoC) な部分は複雑だった。 Grailsの裏側解説(簡易版) GrailsPlugin grailsApplication grails-app以下のgroovyファイル達 grails-app/domin/Book.groovy Author.groovy grails-app/service/SomeService.groovy HogeService.groovy リソースロード ・ロードされたリソースをgrailsApplicationから用途別に収集 ・クラス名とかプロパティ内容を元に   ファクトリビーン(RootBeanDefinition)や、他のビーンとの関連等を生成 ・生成されたビーン等をapplicationContextに登録する。 ※"applicationContext.registerBeanDefinition()"する
  19. 19. 少し歴史など。 applicationContext.xmlの内容ヒストリー grailsApplication grailsResourceHolder characterEncodingFilter 0.1 pluginMetaManager 0.6 -> 現在 grailsResourceLoader domainInjector 0.3 injectionOperation pluginManager 0.4 0.4.2-0.5.6 grailsConfigurator BeanBuilder実装 ユーザ拡張可能な、 Plugin実装 内部的な Plugin実装 0.2
  20. 20. Grailsでのビーン生成と、BeanBuilder誕生まで CoCを実現するために。 0.1時代。- SpringConfigクラスで全てを行っていた。 0.2-0.3.1時代。 プラグインの原型が登場。 この時代は、インターフェイスGrailsPluginを実装したクラスの doWithGenericApplicationContext()の中で、 RootBeanDefinitionをGenericApplicationContextに registerBeanDefinition()してた。(大変そう!) 0.4以降。 ユーザ拡張可能なプラグインの実装。 この時に、ビーンの追加も容易になるように BeanBuilderってのが実装された。
  21. 21. 簡単にまとめると Grailsに柔軟な拡張性を実装 0.4からのGrailsプラグイン 深い所:ビーン生成などは、 0.2からの仕組みだと敷居が高くて大変だね! ぢゃあ、ビーンも解りやすく ぐるーびぃーに!DSLに! BeanBuilder誕生!
  22. 22. BeanBuilder 実装クラス:grails.spring.BeanBuilder ApplicationContextを構築するための DSL(Domain Specific Language)です。 直感的でわかりやすくSpringビーンを定義できます。 Groovyプログラムを使用して、動的にビーンを定義で きます。 Grailsアプリケーション以外でも使用できるように設計 されています。
  23. 23. BeanBuiler:単独での使い方 Grailsアプリケーション以外でも 使用できるように設計されているので。 import org.springframework.context.ApplicationContext import grails.spring.BeanBuilder // BeanBuilderの生成 def builder = new BeanBuilder() builder.beans { // ここに定義を書く! } // ApplicationContextの生成 ApplicationContext ctx = builder.createApplicationContext()
  24. 24. BeanBuiler基本書式 基本! someBean(MySomeBean,"引数1",2 ,[3]){bean-> bean.singleton = false bean.factoryMethod = "getInstance" fieldOne = "JGGUG" anotherBean = ref("anotherBean",true) } id クラス名 引数達 ビーン構成用インスタンス AbstractBeanDefinition <bean . . . factoryMethod="getInstance"/> などのアトリビュートが定義 プロパティ定義 ビーン参照
  25. 25. クロージャの最初の引数は AbstractBeanDefinition org.springframework.beans.factory.support. AbstractBeanDefinition   → ビーン構成用インスタンス     <bean>のdestroy-method等のアトリビュート 設定方法 “-”をCamelCaseにする。 Ex. destroy-method → destroyMethod
  26. 26. ■Factoryメソッドの使用例 withFactoryMethod(BeanWithFactoryMethod){bean-> bean.factoryMethod = "getInstance" bean.scope = "prototype" person = "tyama" } ■Bean定義の戻り値はビーン構成用インスタンスなので、 戻り値の変数に指定もできます。 def somebean = withFactoryMethod(BeanWithFactoryMethod){ person = "tyama" } somebean.factoryMethod = "getInstance" somebean.scope = "prototype" ビーン構成用インスタンス AbstractBeanDefinition ビーン構成用インスタンス AbstractBeanDefinition ファクトリビーン
  27. 27. ビーンスコープ ビーンスコープ - 基本は全てシングルトンです。 prototype flash flow conversation session singleton withFactoryMethod(BeanWithFactoryMethod){bean-> bean.factoryMethod = "getInstance" bean.scope = "prototype" person = "tyama" } スコープ
  28. 28. ビーンの参照 ApplicationContextで管理されている他のビーンへの参照 xml定義での <ref bean="anotherBean"/> ref("anotherBean") と書きます。 ref("anotherBean",true) と指定すると 親ApplicationContextのみを参照します。
  29. 29. ■ビーンの参照 beanA(BeanA){ name="bean a" } ■ref("...")で指定する beanB(BeanB){ name="bean b" parent=ref("beanA") } ■ref("...")は、省略可能 beanBB(BeanB){ name="bean b" parent=beanA } ■ref("...",true)第2引数にtrueを指 定して親ApplicationContext内のみ を参照 beanBParent(BeanB){ name="bean b" parent= ref("beanAParent",true) }
  30. 30. Anonymous Inner Beans 匿名インナービーン exampleInner(ExampleBean2){ bean = {ExampleBean b -> name="My First Inner Bean" num=24 } } ■Factory Beanを使った例 exampleInnerBeanFactory(ExapleBeanFactory) exampleInnerUntyped(ExampleBean2){ bean = {bean-> bean.factoryBean = "exampleInnerBeanFactory" bean.factoryMethod = "newInstance" name="example BeanFactory" num=24 } }
  31. 31. Beanの継承、抽象ビーン <bean id="exampleAbstractBeanNoClass" abstract="true"> <property name="name" value="abstract bean"/> <property name="num" value="20"/> </bean> <bean id="exampleNoCls" parent="exampleAbstractBeanNoClass" class="ExampleBean"> <property name="name" value="My First Bean"/> </bean> <bean id="exampleAbstractBeanWiCn" abstract="true" class="ExampleBean"> <property name="name" value="abstract bean"/> <property name="num" value="23"/> </bean> <bean id="exampleWiCn" parent="exampleAbstractBeanWiCn"> <property name="name" value="My First Bean"/> </bean>
  32. 32. Beanの継承、抽象ビーン exampleAbstractBeanNoClass { name="abstract bean" num = 20 } (SomeClass)クラスの指定を無くす exampleNoCls(ExampleBean){ bean -> bean.parent = exampleAbstractBeanNoClass name = "My First Bean" } bean.parentに指定する。 exampleAbstractBeanWiCn(ExampleBean){ bean -> bean.'abstract' = true name="abstract bean" num = 23 } bean.‘abstract’=trueを指定
  33. 33. 動かしてみる Grails徹底入門10章を参考に! Gantは1.6.1 Binary, standalone installationを使用 執筆時と一部仕様が変わっているので修正。 build.gantの中の Ant → ant に変更。 libの中身を変更 commons-logging-1.1.jar grails-bootstrap-1.1.1.jar grails-spring-1.1.1.jar groovy-all-1.6.3.jar spring-2.5.6.jar デモ
  34. 34. BeanBuilderの 利用方法はおさえたので
  35. 35. Grailsで Springビーンを Groovyに使う!
  36. 36. GrailsでSpringビーンをGroovyに使う! GrailsアプリケーションにSpringビーンを追加。 正しい方法は3つ resources.xmlに記述。 resources.groovyにBeanBuilderで記述。 Grailsプラグインにしてしまう。 Grailsのプロジェクト内で定義されたビーンを使うには def someBean と宣言するだけでOK.
  37. 37. resources.xml grails-app/conf/spring/resources.xmlに xmlでのビーン定義をそのまま書く。 デモ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="exampleBean" class="bean.ExampleBean"> <constructor-arg value="hello exampleBean"/> <property name="name" value="My First Bean" /> <property name="num" value="19" /> </bean> </beans> package bean class ExampleBean { def name def num ExampleBean(){} ExampleBean(String arg){println arg} String toString(){ "ExamplBean: $name $num" } }
  38. 38. resources.groovy grails-app/conf/spring/resources.groovyに BeanBuilderで記述。 デモ package bean class ExampleBean { def name def num ExampleBean(){} ExampleBean(String arg){println arg} String toString(){ "ExamplBean: $name $num" } } beans = { exampleBean(ExampleBean,"hello exampleBean"){ name = "My First Bean" num = 19 } }
  39. 39. 実装変更に使える grails-app/conf/spring/resources.groovy( or xml)で 同名称(id)のビーンが追加された場合は、 内容が上書きされます。 例えば、既に定義されている “dataSource”ビーンの 実装クラスを変えて定義し直したい場合。 dataSource(com.mchange.v2.c3p0.ComboPooledDataSource) { bean -> bean.destroyMethod = "close" driverClass = "org.hsqldb.jdbcDriver" jdbcUrl="jdbc:hsqldb:hsql://localhost:9001" user="sa" password="" } 定義したIDが同名のビーン内容が上書きされる ここを変えてみた
  40. 40. GrailsプラグインでdoWithSpring 再利用しちゃいましょう! class JggugBeanGrailsPlugin { // the plugin version def version = "0.1" .... def doWithSpring = { // TODO Implement runtime spring config (optional) exampleBean3(bean.ExamplePluginBean,"hello plugin exampleBean3"){ name = "My 3rd Bean" num = 100 } } .... } プラグインの細かい話はJGGUGの勉強会「G*」で!
  41. 41. SpringでGrailsを 使ってGroovyに!
  42. 42. applicationContext.groovy!? Grailsのソースリポジトリにコッソリ!?置いてある。 grails-sample/standalone-beanbuilder 若干古いです。 内容 <context-param>のcontextConfigLocationに /WEB-INF/applicationContext.groovyを指定 <context-param>のcontextClassに GrailsWebApplicationContextを指定 あとはビーンビルダで定義するだけ。 ソースの中を見てみましょう
  43. 43. GrailsのGORMを使う! スタンドアロンでGORMが使用可能! Spring MVCでのサンプル、 GRAILS_HOME/samples/petclinic-mvcを参照 applicationContext.xmlにデータソースと、 <gorm:sessionFactory/>の定義。 <gorm:sessionFactory base-package="org.grails.samples" data-source-ref="dataSource" message-source-ref="messageSource"> <property name="hibernateProperties"> <util:map> <entry key="hibernate.hbm2ddl.auto" value="update"/> </util:map> </property> </gorm:sessionFactory> import grails.persistence.Entity @Entity class Person { String name ... } Person.groovy
  44. 44. まとめ Annotationがあるぢゃないか!? (これは言わない!) BeanBuilderを使うと Grails → Springビーン利用は簡単ですよ。 そして柔軟(ダイナミックだし)なので、いろいろSpringビーン の活用幅がひろがりそう。 単独で動作するので、単純なビーンのテストとかに使える? Grailsから派生したGORM Spring → Grailsのコンポーネント利用 Springの内部もぐるーびぃーになる。 みなさんの実運用でどうなのか解りませんが・・ Grailsでドメイン設計して、 ほぼ,そのままSpringで利用可能?
  45. 45. 将来!?次期バージョンでどうなる? 現在のGrailsでは、Spring 2.5.6なので、3.0に更新したら どうなっていくのか!? Grails-1.2から、Spring-3になるそうです。 Graemeさんがtwitterで、いろいろつぶやいてました。
  46. 46. Q&A お手柔らかに、お願いします。(T.T) 濃い話しはNGで・・・ 参考資料 Grails徹底入門 The Definitive Guide to Grails 2nd Grails-0.1∼1.2のソースコード
  47. 47. Thank You! 合同勉強会、またやりたいですね。 JSUGの勉強会も参加してみたいです! みなさまの、   JGGUGへの参加     お待ちしています。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×