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

Spring2概論@第1回JSUG勉強会