Spring2概論@第1回JSUG勉強会

11,219 views

Published on

発表に利用した資料。
元ネタはRod氏が作成した資料を和訳(インチキ意訳?)したものです。
OpenOffice2.1にて作成。

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

No Downloads
Views
Total views
11,219
On SlideShare
0
From Embeds
0
Number of Embeds
73
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Spring2概論@第1回JSUG勉強会

  1. 1. Spring2概論 <ul><ul><li>Japan Spring User Group </li></ul></ul><ul><ul><li>(日本Springユーザー会) </li></ul></ul>
  2. 2. 日本Springユーザー会とは <ul><li>沿革 </li></ul><ul><ul><li>2006年 発足 </li></ul></ul><ul><ul><li>2007年 本格的に活動開始 </li></ul></ul><ul><li>目標 </li></ul><ul><ul><li>国内のSpringに関する情報交換の場を提供すること </li></ul></ul><ul><li>活動内容 </li></ul><ul><ul><li>メーリングリストの運営 </li></ul></ul><ul><ul><li>勉強会や呑み会の企画と開催 </li></ul></ul><ul><ul><li>イベントへの参加 </li></ul></ul><ul><ul><li>ドキュメントやサンプルの作成と公開 </li></ul></ul>
  3. 3. このセッションのゴール <ul><ul><li>Spring のコアコンセプトのおさらい </li></ul></ul><ul><ul><li>Spring2.0 の強化部分を見てみる </li></ul></ul>
  4. 4. <ul><li>Spring のふりかえり </li></ul><ul><li>Spring利用事例 </li></ul><ul><li>Spring2.0新機能の概要 </li></ul><ul><li>拡張可能な XML 設定 </li></ul><ul><li>AspectJ 統合の強化 </li></ul><ul><li>まとめ </li></ul>アジェンダ
  5. 5. Springの目的 <ul><li>2002年、Spring誕生 </li></ul><ul><ul><li>目的はJ2EEベース開発の複雑さを減らす事 </li></ul></ul><ul><ul><ul><li>機能を犠牲にすることなくシンプルに </li></ul></ul></ul><ul><li>難しい「ベストプラクティス」を容易に適用出来る </li></ul><ul><ul><li>デザインパターン </li></ul></ul><ul><ul><li>インタフェースベースの疎結合なプログラム </li></ul></ul><ul><li>Rod氏や他のアーキテクト達の経験を元にして 成熟していった </li></ul><ul><ul><li>簡単なものは簡単であるべきである。複雑なものは実現できるべきである — アラン・ケイ </li></ul></ul><ul><ul><ul><li>簡単なものが簡単でない限り、複雑なものは実現出来ない </li></ul></ul></ul>
  6. 6. <ul><li>アプリケーションをPOJOでコーディング可能にする </li></ul><ul><ul><li>簡略で洗練された設定記述方法を提供する </li></ul></ul><ul><ul><li>非侵略的な方法でPOJOに対してエンタープライズサービスを適用する </li></ul></ul><ul><ul><ul><li>トランザクションAPIを知らなくても、 POJOでトランザクション 管理を可能に </li></ul></ul></ul><ul><ul><ul><li>MBeanインターフェイスを実装する必要なく、POJOでJMX 管理下に入る事を可能に </li></ul></ul></ul><ul><ul><ul><li>EJBのインタフェースを実装することなく、POJOでEJBとして 動作が可能に </li></ul></ul></ul>Spring のコアコンセプト
  7. 7. POJOによる開発 <ul><li>POJOは どの環境にも依存しない </li></ul><ul><ul><li>ビルドするのに特定のクラスをインポートする必要が無い </li></ul></ul><ul><ul><li>特定のlookupメカニズムに依存しない </li></ul></ul><ul><ul><ul><li>各インスタンスはJavaのコンストラクタかセッターによってInjectされる </li></ul></ul></ul><ul><ul><ul><li>変わりやすいインフラストラクチャから分離することで、ビジネスロジックを末長く利用出来る </li></ul></ul></ul><ul><li>POJOは 単体でテストする事が出来る </li></ul><ul><ul><li>テスト駆動型開発とも相性が良い </li></ul></ul><ul><ul><ul><li>JUnit、TestNG </li></ul></ul></ul>
  8. 8. <ul><li>アプリケーションオブジェクトを特定の環境から分離する </li></ul><ul><ul><li>疎結合にし, 再利用可能に </li></ul></ul><ul><li>従来の侵略的なコンポーネントモデル よりも強力 </li></ul><ul><ul><li>侵略的なコンポーネントモデルって? </li></ul></ul><ul><ul><ul><li>EJB2.x </li></ul></ul></ul><ul><ul><ul><li>Struts </li></ul></ul></ul><ul><ul><li>アプリケーションのコードを書き換えること無くスケールアップorダウンできる </li></ul></ul><ul><ul><ul><li>JTAのグローバルトランザクションへの切り替え </li></ul></ul></ul><ul><ul><ul><li>ビジネスオブジェクトを異なる環境下へエクスポート </li></ul></ul></ul><ul><ul><ul><ul><li>SLSB, Web サービス , JavaSpaces, 他 </li></ul></ul></ul></ul>POJO に宣言的にサービスを適用
  9. 9. POJOへサービスの提供 Simple Object シンプル オブジェクト (POJO) AOP 抽象化されたサービス (SLSB,Web Service,etc...) = パワフルなシステム 依存性注入 (DI)
  10. 10. Springの市場価値 <ul><li>SpringのPOJOによる抽象化概念は、J2EEテクノ ロジーを超えた広い範囲で価値が認められている </li></ul><ul><ul><li>ServiceMix(JBI)、SCA、pitchfork・・・ </li></ul></ul><ul><ul><li>エコシステムとしての側面 </li></ul></ul><ul><li>多くの企業が、従来の高コストで能率の悪い J2EEから移行 </li></ul><ul><li>いくつかのベンダの基板テクノロジーとして採用され、さらなる利用増加が… </li></ul><ul><ul><li>BEA WebLogic 10, WebLogic RealTime Server </li></ul></ul><ul><ul><li>Oracle Fusion middleware products </li></ul></ul>
  11. 11. Springは何をもたらしたか? <ul><li>アプリケーションを POJO でコーディング可能に </li></ul><ul><ul><li>再利用性の向上 </li></ul></ul><ul><ul><ul><li>基板プラットフォームからビジネスロジックを分離する </li></ul></ul></ul><ul><li>よくある問題に対する解決策 </li></ul><ul><ul><li>インスタンス管理、ファクトリ </li></ul></ul><ul><li>ベストプラクティスを実現しやすくする </li></ul><ul><ul><li>インタフェースベースの疎結合なプログラム </li></ul></ul><ul><li>どんな環境でも動作する、単純で一貫した プログラミングモデル </li></ul><ul><li>テストを容易に </li></ul><ul><ul><li>ラウンドトリップ開発がもっとクイックに </li></ul></ul>
  12. 12. <ul><li>Springのふりかえり </li></ul><ul><li>Spring利用事例 </li></ul><ul><li>Spring2.0新機能の概要 </li></ul><ul><li>拡張可能な XML 設定 </li></ul><ul><li>AspectJ 統合の強化 </li></ul><ul><li>まとめ </li></ul>アジェンダ
  13. 13. 誰がSpringを使ってるの? <ul><li>Rod氏曰く・・・・ </li></ul><ul><ul><li>110万件以上のダウンロード実績があり、さらに現在も増加中 </li></ul></ul><ul><li>さまざまな業種で採用が拡大 </li></ul><ul><ul><li>小売や投資銀行 </li></ul></ul><ul><ul><ul><li>世界TOP10の銀行のほとんどがInterface21の顧客で、Springのユーザー </li></ul></ul></ul><ul><ul><li>欧米の保険会社 </li></ul></ul><ul><ul><li>政府 </li></ul></ul><ul><ul><ul><li>欧州特許庁 </li></ul></ul></ul><ul><ul><ul><li>フランスのオンライン税制システム </li></ul></ul></ul><ul><ul><ul><li>米、カナダ、オーストラリアの政府機関 </li></ul></ul></ul>
  14. 14. その他業種でSprinが使われてる? <ul><li>科学研究 </li></ul><ul><li>航空会社産業 </li></ul><ul><li>セキュリティ企業 </li></ul><ul><li>メディアとオンライン企業 </li></ul><ul><ul><li>eBay </li></ul></ul><ul><ul><li>その他たくさん… </li></ul></ul><ul><li>ソフトウェアベンダ </li></ul><ul><ul><li>OracleやBEAも含む </li></ul></ul><ul><li>などなど・・・ </li></ul>
  15. 15. ユーザーの事例 欧州特許庁 Spring を導入することによって、ビジネス上の焦点に集中することが出来ました。 Spring によって、モジュールと機能を容易に結び付けることが可能となったからです。 以前は多くの人と時間 ( 数年 ) をかけてやっていたことが、 Spring と Spring Modules を利用して 2,3 ヶ月で成し遂げました。 Roland Nelson 欧州特許庁
  16. 16. ユーザーの事例 フランス税務署 フランス税務署 オンライン税システム アクセンチュアによる SI Spring ベース Spring は J2EE テクノロジーの生産性に重要な改善を与えました。 その単純だが強力なプログラミングモデルによって我々は開発の時間を短縮し、より上質なシステムの作成に成功しました。 トーマス・ヴァンデベルデ リード Java アーキテクト アクセンチュア
  17. 17. ユーザの事例 Voca <ul><ul><li>Voca 世界で 4 番目に大きい重要な国家基板 ( 日本でいう全銀のようなもの? ) </li></ul></ul><ul><ul><li>Voca の役割は、仕事は銀行間の口座引落やクレジット、自動振替などを制御する事 </li></ul></ul><ul><ul><li>2005 年は 50 億件以上のトランザクションがあり、金額にして 4 兆 5000 億ユーロにも登る </li></ul></ul><ul><ul><li>ヨーロッパの口座引落とクレジットの 15% は Voca によって行われる </li></ul></ul><ul><ul><li>ピーク時には 1 日 8000 万件以上のやりとり </li></ul></ul><ul><ul><li>30年間一度もトランザクションをロストしたことは無い </li></ul></ul>
  18. 18. VocaがSpringによって得た利益 <ul><li>システム効率を犠牲にしない開発者の生産性向上 </li></ul><ul><li>コンポーネントのテスタビリティ向上 </li></ul><ul><li>よい開発プラクティスの助長 </li></ul><ul><li>強力なサポート(By Interface21) </li></ul><ul><li>Springをつかって記録的な数のトランザクションを処理した </li></ul>
  19. 19. <ul><li>Springのふりかえり </li></ul><ul><li>Spring利用事例 </li></ul><ul><li>Spring2.0新機能の概要 </li></ul><ul><li>拡張可能な XML 設定 </li></ul><ul><li>AspectJ 統合の強化 </li></ul><ul><li>まとめ </li></ul>アジェンダ
  20. 20. Spring 2.0 <ul><li>多くの実績を持つ Spring1.0 のテクノロジーを元にバージョンアップ </li></ul><ul><li>POJO ベース開発 の継続 </li></ul><ul><li>新しい機能で多くの処理をよりエレガントに </li></ul>
  21. 21. Spring 2.0のゴール <ul><li>色々な事を もっとシンプルに </li></ul><ul><li>Springを もっとパワフルに </li></ul>
  22. 22. Spring 2.0の新機能 <ul><li>多数の大きな強化と新機能 </li></ul><ul><li>特筆すべきは・・・ </li></ul><ul><ul><li>Beanスコープのオプションの拡張 </li></ul></ul><ul><ul><li>動的言語のサポート </li></ul></ul><ul><ul><li>Spring MVC、Spring JDBCの強化 </li></ul></ul><ul><ul><ul><li>Java5への対応 </li></ul></ul></ul><ul><ul><li>メッセージドリブンPOJOs </li></ul></ul><ul><ul><li>よりシンプルで拡張可能なXML設定の導入 </li></ul></ul><ul><ul><li>AspectJ統合の強化 </li></ul></ul><ul><ul><li>JPA (EJB 3.0 Java Persistence API)の統合 </li></ul></ul>
  23. 23. <ul><li>従来のsingleton,prototype以外にもスコープが 追加 </li></ul><ul><ul><li>request,session,grobalsession </li></ul></ul><ul><ul><ul><li>ServletやPortletのセッション等を利用 </li></ul></ul></ul><ul><ul><li>カスタマイズも可能 </li></ul></ul><ul><ul><ul><li>プラガブルなバックエンドストア </li></ul></ul></ul><ul><ul><ul><li>Webティアと結び付かない </li></ul></ul></ul><ul><ul><ul><li>例えばSeamとの統合 </li></ul></ul></ul>Beanスコープオプションの拡張
  24. 24. ダイナミックランゲージ <ul><li>スクリプト言語のサポート </li></ul><ul><ul><li>Groovy やJRubyなどでBeanを定義できる </li></ul></ul><ul><ul><ul><li>DIやAOPなどの全てのSpringの機能を使える </li></ul></ul></ul><ul><ul><li>定義されたBeanは実装言語や設定が隠蔽される </li></ul></ul><ul><ul><ul><li>利用者側はBeanの実装言語を気にする必要がない </li></ul></ul></ul><ul><ul><li>参照が残っていれば、いつでもダイナミックに再ロードできる </li></ul></ul><ul><li>Springコンポーネントモデルは cross-language に </li></ul>
  25. 25. Demo JRubyコンポーネント
  26. 26. Spring Web MVC <ul><li>Spring Web MVCの強化 </li></ul><ul><ul><li>デフォルト設定を改良 して、良くあるケースの設定を減らした </li></ul></ul><ul><ul><li>ダイナミック言語サポートからの恩恵 </li></ul></ul><ul><ul><ul><li>GroovyやJRubyのAuthor controllersは オンザフライ に修正が反映される </li></ul></ul></ul><ul><ul><li>一般的なコントロールをシンプルにする新しいタグライブラリ </li></ul></ul><ul><ul><ul><li>Struts tag libraryに似ている </li></ul></ul></ul><ul><ul><li>Ajaxなどのリッチライブラリも追加 </li></ul></ul><ul><ul><ul><li>サジェストとコントリビューションが追加 </li></ul></ul></ul><ul><ul><ul><li>リッチライブラリは今後も徐々に増加予定 </li></ul></ul></ul>
  27. 27. メッセージドリブンPOJOs <ul><li>JMSメッセージの 非同期受信 をサポート </li></ul><ul><ul><li>XA-トランザクション受信をフルサポート </li></ul></ul><ul><li>Springのコア概念を継承 </li></ul><ul><ul><li>J2EE と J2SEどちらでも動作する </li></ul></ul><ul><li>EJBの利用を正当化する数少ない理由が無くなる </li></ul>
  28. 28. Spring JDBC <ul><li>SimpleJdbcTemplate </li></ul><ul><ul><li>Java 5の機能をシンプルに利用できる </li></ul></ul><ul><ul><ul><li>可変長引数 </li></ul></ul></ul><ul><ul><ul><li>オートボクシング </li></ul></ul></ul><ul><ul><ul><li>パラメータライズドメソッド </li></ul></ul></ul><ul><ul><li>一般的に用いられる方法を利用している </li></ul></ul><ul><ul><ul><li>もっとも一般的に利用されるコールバック </li></ul></ul></ul><ul><ul><ul><li>少量のオーバーライドメソッド </li></ul></ul></ul><ul><ul><li>JdbcTemplateへ機能を追加するためのラッパーとして動作 </li></ul></ul><ul><ul><li>SimpleJdbcDaoSupportクラスを提供 </li></ul></ul>
  29. 29. 可変長引数とオートボクシング <ul><li>以前のjdbcTemplateと比較 </li></ul><ul><ul><li>jdbcTemplate.queryForInt(&quot;SELECT COUNT(0) FROM T_CLIENT WHERE TYPE=? AND CURRENCY=?&quot;, </li></ul></ul><ul><ul><li>new Object[] { new Integer(13), &quot;GBP&quot; } </li></ul></ul><ul><ul><li>); </li></ul></ul><ul><ul><li>jdbcTemplate.queryForInt(&quot;SELECT COUNT(0) FROM T_CLIENT WHERE TYPE=? AND CURRENCY=?&quot;, </li></ul></ul><ul><ul><li>new Object[] { 13, &quot;GBP&quot; } </li></ul></ul><ul><ul><li>); </li></ul></ul><ul><ul><li>simpleJdbcTemplate.queryForInt(&quot;SELECT COUNT(0) FROM T_CLIENT WHERE TYPE=? AND CURRENCY=?&quot;, </li></ul></ul><ul><ul><li>13, &quot;GBP&quot; </li></ul></ul><ul><ul><li>); </li></ul></ul>JdbcTemplate, オートボクシング SimpleJdbcTemplate, 可変長引数 JdbcTemplate, <= Java 1.4
  30. 30. SimpleJdbcTemplate: ジェネリクス <ul><li>ジェネリクスによってシグニチャを明確にし、 キャストを排除する </li></ul><ul><ul><ul><li>public Map<String, Object> </li></ul></ul></ul><ul><ul><ul><li>queryForMap(String sql, Object... args) </li></ul></ul></ul><ul><ul><ul><li>throws DataAccessException </li></ul></ul></ul><ul><ul><ul><li>public List<Map<String, Object>> </li></ul></ul></ul><ul><ul><ul><li>queryForList(String sql, Object ... args) </li></ul></ul></ul><ul><ul><ul><li>throws DataAccessException </li></ul></ul></ul>
  31. 31. <ul><li>Java Persistence API (JPA) はEJB3.0仕様の 永続化部分 </li></ul><ul><ul><li>Hibernateのコンセプトを仕様化 </li></ul></ul><ul><li>Springの統一された抽象化概念によって JPAのAPIをラップする </li></ul><ul><ul><li>Springのコアコンセプトを実現 </li></ul></ul><ul><ul><ul><li>Java EEとJava SEの統一プログラミングモデル </li></ul></ul></ul><ul><ul><ul><li>テストの容易化(APサーバへのデプロイの必要は無い) </li></ul></ul></ul><ul><li>EJBコンテナ無しでJPAのフル機能を利用できる </li></ul><ul><li>永続化プロバイダに対してJPA仕様を越えた ポータビリティをあたえる </li></ul>Spring と Java Persistence API
  32. 32. その他の新しい機能 <ul><li>タスクスケジューラ </li></ul><ul><ul><li>CommonJ TimerManager実装 </li></ul></ul><ul><li>ポートレットMVCフレームワーク </li></ul><ul><ul><li>Spring MVCに良くにていて使い易い </li></ul></ul><ul><li>その他盛りだくさん・・・ </li></ul>
  33. 33. Ease of Use <ul><li>設定が簡略化 </li></ul><ul><li>MVC が簡略化 </li></ul><ul><ul><li>デフォルト設定だけでより適切に動作するように </li></ul></ul><ul><li>JDBCが簡素化 </li></ul><ul><ul><li>SimpleJdbcTemplate </li></ul></ul><ul><ul><ul><li>JavaEEプラットフォーム上でジェネリクス、可変長引数、オートボクシングを利用するようにデザインされている </li></ul></ul></ul><ul><li>その他, もっともっと盛りだくさん… </li></ul>
  34. 34. Spring 2.0を用いたシステム Middle tier definitions DAO 実装 Spring web-tier context プレゼンテーション ティア DAO インタフェース Service オブジェクト / Business ファサード (SLSBs の様に ) RDBMS ドメイン オブジェクト トランザクショナル バウンダリ リモート エクスポーター JDBC ™ software/ ORM リモートクライアントのエンドポイント : SOAP, RMI, … Spring DAO Spring AOP ビュー : JSP, Velocity,… Java: MVC コントローラー
  35. 35. アジェンダ <ul><li>Spring のふりかえり </li></ul><ul><li>Spring利用事例 </li></ul><ul><li>Spring2.0新機能の概要 </li></ul><ul><li>拡張可能な XML 設定 </li></ul><ul><li>AspectJ 統合の強化 </li></ul><ul><li>まとめ </li></ul>
  36. 36. Spring 2.0のXML設定 <ul><li>Spring Bean定義内に新しいXMLタグを定義出来る </li></ul><ul><ul><li>しかも複数定義出来る </li></ul></ul><ul><ul><li>従来の設定方法よりも簡潔になる </li></ul></ul><ul><ul><ul><li>メンテナンスも楽に </li></ul></ul></ul><ul><ul><li>XMLスキーマバリデーション </li></ul></ul><ul><ul><ul><li>独自のツールでサポートよりも標準的な物が使える </li></ul></ul></ul><ul><ul><ul><li>OSS系のツールを使えばタダでコードが完成する </li></ul></ul></ul><ul><ul><li>XMLのパワーをフルに利用 </li></ul></ul><ul><ul><ul><li>名前空間、スキーマ、ツール </li></ul></ul></ul><ul><li>旧版との互換性 </li></ul><ul><ul><li><beans> DTDのフルサポート </li></ul></ul>
  37. 37. XML設定(JNDI lookup) <ul><li>JNDI-lookupの例 </li></ul><bean id=&quot;dataSource&quot; class=&quot;...JndiObjectFactoryBean&quot;> <property name=&quot;jndiName&quot; value=&quot;jdbc/StockData&quot;/> </bean> <jee:jndi-lookup id=&quot;dataSource&quot; jndiName=&quot;jdbc/StockData&quot;/>
  38. 38. XML設定(プロパティファイル) <ul><li>プロパティファイルの例 </li></ul><bean id=&quot;properties&quot; class=&quot;...PropertiesFactoryBean&quot;> <property name=&quot;location&quot; value=&quot;jdbc.properties&quot;/> </bean> <util:properties id=&quot;properties&quot; location=&quot;jdbc.properties&quot;/>
  39. 39. トランザクション管理の簡略化 <ul><li>トランザクショナル化の専用アノテーションを用意 </li></ul><ul><ul><li>@Transactional </li></ul></ul><ul><ul><li>IDEコードアシストとマッチする </li></ul></ul><ul><ul><li>実は1.2.xからある </li></ul></ul><ul><li><tx:annotation-driven />を設定 </li></ul>
  40. 40. 拡張スキーマ <ul><li>標準でいくつかの拡張スキーマが用意されている </li></ul><ul><ul><li>utilスキーマ </li></ul></ul><ul><ul><ul><li>ユーティリティ機能の設定 </li></ul></ul></ul><ul><ul><li>langスキーマ </li></ul></ul><ul><ul><ul><li>動的言語の設定 </li></ul></ul></ul><ul><ul><li>aopスキーマ </li></ul></ul><ul><ul><ul><li>AOPの設定 </li></ul></ul></ul><ul><ul><li>txスキーマ </li></ul></ul><ul><ul><ul><li>トランザクションの設定 </li></ul></ul></ul><ul><ul><li>jeeスキーマ </li></ul></ul><ul><ul><ul><li>JNDI/EJBのlookupの設定 </li></ul></ul></ul>
  41. 41. カスタム拡張スキーマの作成: ステップ1 <ul><li>XSDを記述してelementコンテンツを定義 </li></ul><ul><li>なぜXSD? </li></ul><ul><ul><li>DTDよりも高度なバリデーションをサポート </li></ul></ul><ul><ul><li>開発ツールから恩恵を得られる </li></ul></ul><ul><ul><ul><li>標準的なXMLエディタがあればいい </li></ul></ul></ul>
  42. 42. カスタム拡張スキーマの作成: ステップ2 <ul><li>エレメント要素からSpringBean定義を生成するためにNamespaceHandlerを実装 </li></ul><ul><ul><li>public interface NamespaceHandler { </li></ul></ul><ul><ul><li>BeanDefinitionParser findParserForElement( </li></ul></ul><ul><ul><li>Element element); </li></ul></ul><ul><ul><li>BeanDefinitionDecorator </li></ul></ul><ul><ul><li>    findDecoratorForElement(Element element); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public interface BeanDefinitionParser { </li></ul></ul><ul><ul><li>void parse(Element element, </li></ul></ul><ul><ul><li>BeanDefinitionRegistry registry); </li></ul></ul><ul><ul><li>} </li></ul></ul>
  43. 43. カスタム拡張スキーマの作成: ステップ3 <ul><li>META-INF/spring.handlers にマッピング定義を追加 </li></ul><ul><ul><ul><li>http://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler </li></ul></ul></ul><ul><ul><ul><li>http://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler </li></ul></ul></ul><ul><ul><ul><li>http://www.springframework.org/schema/jndi=org.springframework.jndi.config.JndiNamespaceHandler </li></ul></ul></ul><ul><ul><ul><li>http://www.springframework.org/schema/tx=org.springframework.transaction.config.TxNamespaceHandler </li></ul></ul></ul><ul><ul><ul><li>http://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler </li></ul></ul></ul>
  44. 44. カスタム拡張スキーマの利用 <ul><li>関連したXSDをインポート </li></ul><ul><li>新しいエレメントを利用する </li></ul><ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul></ul><ul><ul><li><beans </li></ul></ul><ul><ul><li>xmlns=&quot;http://www.springframework.org/schema/beans&quot; </li></ul></ul><ul><ul><li>xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; </li></ul></ul><ul><ul><li>xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot; </li></ul></ul><ul><ul><li>xsi:schemaLocation=&quot; </li></ul></ul><ul><ul><li>http://www.springframework.org/schema/beans </li></ul></ul><ul><ul><li>http://www.springframework.org/schema/beans/spring </li></ul></ul><ul><ul><li>beans.xsd </li></ul></ul><ul><ul><li>http://www.springframework.org/schema/aop </li></ul></ul><ul><ul><li>http://www.springframework.org/schema/aop/spring-aop.xsd&quot;> </li></ul></ul>
  45. 45. XML設定のベストプラクティス <ul><li>スタンダード<bean>タグ </li></ul><ul><ul><li>依然として多くの場合に適した設定方法 </li></ul></ul><ul><ul><li>一般的な設定タスク </li></ul></ul><ul><ul><li>アプリケーション特有のコンポーネントに利用 </li></ul></ul><ul><ul><ul><li>DAO, サービス, Webティア </li></ul></ul></ul><ul><li>カスタムタグ </li></ul><ul><ul><li>インフラストラクチャタスク </li></ul></ul><ul><ul><ul><li>JNDI, プロパティ, AOP, トランザクション,動的言語連携・・・ </li></ul></ul></ul><ul><ul><li>サードパーティパッケージ </li></ul></ul>
  46. 46. Agenda <ul><li>Springのふりかえり </li></ul><ul><li>Spring利用事例 </li></ul><ul><li>Spring2.0新機能の概要 </li></ul><ul><li>拡張可能な XML 設定 </li></ul><ul><li>AspectJ 統合の強化 </li></ul><ul><li>まとめ </li></ul>
  47. 47. AOPを振り返る:なぜAOPは重要か? <ul><li>POJO プログラミングモデルを補完する重要な要素 </li></ul><ul><li>新しい方向性のアプリケーション構造を構想する ためのツール </li></ul><ul><li>ちょっと振り返ってみましょう… </li></ul>
  48. 48. エンタープライズアプリケーションに 溢れる概念 サービスレイヤー dao リポジトリ web レイヤー データアクセスレイヤー コントローラー ビジネスサービス
  49. 49. 複雑で多様化する要件 <ul><li>各概念には、それぞれ共通の要件がある </li></ul><ul><ul><li>サービスレイヤー は トランザクショナル でなければならない </li></ul></ul><ul><ul><li>DAOオペレーションでSQL例外が発生した場合は、 例外の変換 をしなければならない </li></ul></ul><ul><ul><li>サービスレイヤーオブジェクトはwebレイヤーオブジェクトを 呼んではならない </li></ul></ul><ul><ul><li>ビジネスサービスが並列性に関連した失敗を起こした場合は リトライ出来るように しなければならない </li></ul></ul><ul><ul><li>その他もろもろ・・・ </li></ul></ul>
  50. 50. 複雑で多様化する要件 <ul><li>要件多すぎ・・・・ </li></ul><ul><li>実装めんどくさすぎ・・・・・ </li></ul><ul><li>もっと シンプル に… </li></ul><ul><li>そしてもっと パワフル に </li></ul>
  51. 51. 複雑で多様化する要件の整理 <ul><li>コンポーネントごとに都度実装は非効率的 </li></ul><ul><ul><li>一つの共通の要件なのに、実装が伴わない </li></ul></ul><ul><li>共通する要件をシンプルにまとめるには? </li></ul><ul><ul><li>各要件自体を抽象化して、別出しで実装出来ないものか? </li></ul></ul>
  52. 52. 要件の実現 <ul><li>要件をうまく抽象化してコード化するには </li></ul><ul><ul><li>一つの条件に対して一つのコードモジュールが望ましい </li></ul></ul><ul><ul><ul><li>一つの条件を満たすのにいくつものクラスを実装する必要は無い </li></ul></ul></ul><ul><li>そこで AOP !! </li></ul>
  53. 53. AOP を利用すれば <ul><li>@Aspect </li></ul><ul><li>public class SystemArchitecture { </li></ul><ul><li>@Pointcut(&quot;within(a.b.c.service..*&quot;) </li></ul><ul><li>public void inServiceLayer () {} </li></ul><ul><li>@Pointcut(&quot;within(a.b.c.dao..*&quot;) </li></ul><ul><li>public void inDataAccessLayer () {} </li></ul><ul><li>@Pointcut(&quot;execution(* a.b.c.service.*.*(..))&quot;) </li></ul><ul><li>public void businessService () {} </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>共通する概念をシンプルに実装できる </li></ul>
  54. 54. Spring 2.0のAOP <ul><li>XML設定ファイルに<aop:*/>タグが利用出来る </li></ul><ul><li>より進んだAspectJの統合 </li></ul><ul><ul><li>Pointcut expression language </li></ul></ul><ul><ul><li>Spring AOPでAspectJスタイルのAscpetが利用可能に </li></ul></ul><ul><ul><li>AspectのアノテーションがSpring AOPで利用可能に </li></ul></ul><ul><ul><ul><li>完全にajcコンパイルされたAspectと同じ動きをする </li></ul></ul></ul><ul><li>SpringとAspectJがあれば・・・ </li></ul><ul><ul><li>SpringのIoCコンテナ上で作成されたオブジェクトでなくてもAspectが適用出来る </li></ul></ul>
  55. 55. Spring AOP (1.2.x) の良い点と悪い点 <ul><li>良い点 </li></ul><ul><ul><li>ソリッドなproxy-basedモデル </li></ul></ul><ul><ul><li>拡張性が高い </li></ul></ul><ul><ul><li>採用、利用が容易 </li></ul></ul><ul><ul><ul><li>開発プロセスやサーバ環境に影響を与えない </li></ul></ul></ul><ul><li>悪い点 </li></ul><ul><ul><li>pointcut expression languageが無い </li></ul></ul><ul><ul><li>XML configurationは冗長になりがち </li></ul></ul><ul><ul><li>拡張性はあるが、Java technologyのみで実現 </li></ul></ul>
  56. 56. Spring 2.0のSpring AOP <ul><li>AOPは非常に重要!! </li></ul><ul><li>利点はそのままに、欠点を克服した </li></ul><ul><li>採用、利用のしやすさを保つ </li></ul><ul><ul><li>開発プロセスや、サーバ環境に依存しない </li></ul></ul><ul><li>AspectJの強力な力による利益 </li></ul><ul><li>Spring AOPの進化がAspectJと共に加速する </li></ul>
  57. 57. Spring 2.0版Spring AOPの狙い <ul><li>フル機能のAOPのデファクトスタンダードである、AspectJを利用して動作 </li></ul><ul><ul><li>ちなみにAspectJのリーダーであるAdrian ColyerはInterface21のCTO </li></ul></ul><ul><ul><li>AdrianはAspectJと同じくらいSpringも開発してる </li></ul></ul><ul><ul><ul><li>ってわけで安心? </li></ul></ul></ul><ul><li>XML configuration extensionsを利用できる ように </li></ul>
  58. 58. AspectJ統合による利点 :Spring AOP <ul><li>pointcut expression languageが利用できる </li></ul><ul><li>@AspectJ modelの様な良く考えられたセマンティクスを利用できる </li></ul><ul><li>タイプセーフなadviceを行う能力を手に入れる </li></ul><ul><li>AOPの第一線の研究者からのフィードバックを得られる </li></ul>
  59. 59. AspectJ統合による利点 :AspectJ <ul><li>AspectJ は 言語であって、フレームワークでは無い </li></ul><ul><ul><li>DIとサービスの抽象化を行うフレームワークとの統合 </li></ul></ul><ul><ul><ul><li>DIはAspectと同じぐらいの魅力的で重要な概念 </li></ul></ul></ul><ul><li>AspectJはSpringによって採用が増加する </li></ul>
  60. 60. AspectJ統合による利点 :利用者 <ul><li>SpringやAspectJの知識がそのまま使える </li></ul><ul><li>リッチドメインモデルにエキサイティングな可能性 </li></ul>
  61. 61. Pointcut Expressions <ul><li>SpringAOPでAspectJのpointcut expressions が使える </li></ul><ul><ul><li>Spring XML中に </li></ul></ul><ul><ul><li>@AspectJアスペクト中に </li></ul></ul><ul><ul><li>Javaコード中に </li></ul></ul><ul><ul><ul><li>Spring ProxyFactoryを利用 </li></ul></ul></ul>
  62. 62. AspectJ の Pointcut Expressions の何が良いのか ? <ul><li>シンプルなワイルドカードよりもはるかに強力 </li></ul><ul><ul><li>expression中でpointcutsを整理できる </li></ul></ul><ul><ul><li>名前つきpointcutsを作成して 再利用が可能 </li></ul></ul><ul><ul><li>perform引数にバインディング出来る </li></ul></ul><ul><ul><li>簡潔に複雑なロジックを表すことができる </li></ul></ul>
  63. 63. AspectJ の良書 <ul><li>Rod氏推薦 </li></ul>
  64. 64. AOPにおけるPointcutとは <ul><li>PointcutはOOP以外のプログラム手法を見つけ出すためのツール </li></ul><ul><li>true pointcut modelの無い以前のSpringAOPでは部分的なinterceptionしかできなかった </li></ul><ul><ul><li>crosscuttingロジックのモジュール化という目的を達成できない </li></ul></ul><ul><ul><li>DRY (Don’t repeat yourself)原則 </li></ul></ul><ul><li>Spring AOPはtrue pointcut modelを手に入れた </li></ul><ul><ul><li>AspectJによって </li></ul></ul>
  65. 65. POJOメソッドでのAdvice <ul><li>POJOでAdviceを記述できる </li></ul>public class JavaBeanPropertyMonitor { private int getterCount = 0; private int setterCount = 0; public void beforeGetter() { this.getterCount++; } public void afterSetter() { this.setterCount++; } …
  66. 66. Pointcutsの有効化 <ul><li>XML設定ファイル内に記述 </li></ul>< aop:config > < aop:aspect bean=&quot;javaBeanMonitor&quot;> < aop:before pointcut= &quot;execution(public !void get*())&quot; method=&quot;beforeGetter&quot; /> < aop:afterReturning pointcut= &quot;execution(public void set*(*))&quot; method=&quot;afterSetter&quot; /> </ aop:aspect > </ aop:config >
  67. 67. @AspectJスタイルアスペクト <ul><li>アノテーション中に記述も可能 </li></ul><ul><ul><li>@Aspect </li></ul></ul><ul><ul><li>public class AjLoggingAspect { </li></ul></ul><ul><ul><li>@Pointcut(&quot;execution(* *..Account.*(..))&quot;) </li></ul></ul><ul><ul><li>public void callsToAccount(){} </li></ul></ul><ul><ul><li>@Before(&quot;callsToAccount()&quot;) </li></ul></ul><ul><ul><li>public void before(JoinPoint jp) { </li></ul></ul><ul><ul><li>System.out.println(&quot;Before [&quot; + </li></ul></ul><ul><ul><li>jp.toShortString() + &quot;].&quot;); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>@AfterReturning(&quot;callsToAccount()&quot;) </li></ul></ul><ul><ul><li>public void after() { </li></ul></ul><ul><ul><li>System.out.println(&quot;After.&quot;); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>
  68. 68. Springでの@AspectJスタイル アスペクトの設定 <ul><li><aop:aspectj-autoproxy/>を利用 </li></ul><ul><ul><li><aop:aspectj-autoproxy/> を利用 </li></ul></ul><ul><ul><li><bean id=&quot;account&quot; class=&quot;demo.Account&quot;/> </li></ul></ul><ul><ul><li><bean id=&quot;aspect&quot; class=&quot;demo.ataspectj.AjLoggingAspect&quot;/> </li></ul></ul>
  69. 69. 引数へのバインディング <ul><li>引数をAdviceへバインディングが可能 </li></ul><ul><ul><li>@Aspect </li></ul></ul><ul><ul><li>public class TrackStringSetters { </li></ul></ul><ul><ul><li>private List<String> namesRequested = new LinkedList(); </li></ul></ul><ul><ul><li>@Before(&quot;execution(* *.set*(String)) && args(name) && this(mytype)&quot;) </li></ul></ul><ul><ul><li>public synchronized void onStringSetter(String name, Mytype mytype) { </li></ul></ul><ul><ul><li>if (namesRequested.size() > historySize) { </li></ul></ul><ul><ul><li>namesRequested.remove(0); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>namesRequested.add(name); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public List<String> getNamesRequested() { </li></ul></ul><ul><ul><li>return namesRequested; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>
  70. 70. SpringならではのAOP統合 <ul><li>AspectJベースのプログラミングモデルをproxyによるclass weavingベースのAOPへ適用する </li></ul><ul><ul><li>一貫したプログラミングモデル </li></ul></ul><ul><ul><li>ベースのAspectJはAOPの世界ではデファクト </li></ul></ul><ul><ul><li>同じプログラミングモデルで、ajcによるコンパイルAspectや、load-time weavingを利用可能にする </li></ul></ul><ul><li>いつものとおり、シンプルさとパワーは対立させない </li></ul><ul><ul><li>シンプル過ぎてパワーが足りないなんて事がないように </li></ul></ul>
  71. 71. Demo Spring 2.0 AOP
  72. 72. Spring 2.0採用のリスクは? <ul><li>Spring 2.0は、完全に旧版との互換性を持つ </li></ul><ul><ul><li>既存のコードが動かなくなるのは、Springのコアコンセプトにも反する </li></ul></ul><ul><li>POJOベーステクノロジはJ2EEに不足しているコードの安定性を提供する </li></ul><ul><ul><li>再利用性が高く、末長く使えるビジネスオブジェクト </li></ul></ul><ul><ul><ul><li>Spring1.x -> Spring2.xでも同じ </li></ul></ul></ul>
  73. 73. Spring 2.0を使うにはJava 5が必要? <ul><li>Spring 2.x系はJava platform 1.3以降なら動く </li></ul><ul><li>Java5を使った方が以下のような点でより利益 を享受できる </li></ul><ul><ul><li>@Transactionalアノテーション </li></ul></ul><ul><ul><ul><li>Spring1.2.xでも既に提供済み </li></ul></ul></ul><ul><ul><li>AspectJのpointcut expressionを完全な統合 </li></ul></ul><ul><ul><ul><li>@Ascpetアノテーション </li></ul></ul></ul><ul><li>今までどおり殆どの主要APサーバ(Webコンテナ)で動作する </li></ul><ul><ul><li>またはWebコンテナ無しのスタンドアロンでも </li></ul></ul>
  74. 74. まとめ (1) <ul><li>Spring 2.0の狙い </li></ul><ul><ul><li>既存のPOJOプログラミングモデルの継続 </li></ul></ul><ul><ul><li>よりシンプルに、そしてよりパワフルに </li></ul></ul><ul><li>Spring 2.0はよりシンプルで拡張可能な XML設定を可能にする </li></ul><ul><ul><li>JNDIや AOPトランザクションなどのカスタム属性 </li></ul></ul><ul><li>Spring AOPのAspectJ統合 </li></ul><ul><ul><li>Pointcut expressionのサポート </li></ul></ul><ul><ul><li>AspectJスタイルのアスペクトをサポート </li></ul></ul><ul><ul><li>@AspectJアノテーションのサポート </li></ul></ul>
  75. 75. まとめ (2) <ul><li>そのほかも多数の機能追加 </li></ul><ul><ul><li>Beanスコープの拡張 </li></ul></ul><ul><ul><li>動的言語のサポート </li></ul></ul><ul><ul><li>Spring MVCが扱いやすくなった </li></ul></ul><ul><ul><li>SpringJDBCがJava5に最適化 </li></ul></ul><ul><ul><li>メッセージドリブンPOJOs </li></ul></ul><ul><ul><ul><li>非同期JMSメッセージのサポート </li></ul></ul></ul><ul><ul><ul><li>XA-Transactionのサポート </li></ul></ul></ul><ul><ul><li>ポートレットMVCフレームワーク </li></ul></ul><ul><ul><li>などなど... </li></ul></ul>
  76. 76. 質問その他 みんなで使ってみましょ♪

×