jjug springセッション
DESCRIPTION
JJUGのセッション資料です。TRANSCRIPT
まだまだ Spring~3.1
1
自己紹介 • 長谷川 裕一(日本Springユーザ会 会長)
‒ 1986年、イリノイ州警察指紋システムのアセンブリ言語プログラマからスタートして、PL,PMと経験し、アーキテクト、コンサルタントへ
‒ 現在はオブジェクト指向(特にJava/Spring)を中心に、コンサルティング(IT戦略、技術導入/検証、プロセスetc)や教育で活動
• 書籍 ‒ プログラムの育てかた(ソフトバンク),Spring入門(技術評論社),Spring2.0入門(技術評論社),間違いだらけのソフトウェア・アーキテクチャ(技術評論社)
• その他 ‒ Starlight&Storm LLC代表社員、SQuBOK策定メンバ ‒ 株式会社フルネス取締役、チェンジビジョン・コンサルティング・パートナー
2
おしながき • Spring概要~SpringFrameworkからSpringへ!?
‒ SpringSource.org ‒ SpringSource.com
• Spring3.1~主な追加機能 ‒ Bean定義のプロファイル機能 ‒ 組込みデータベースサポート ‒ Object/XMLマッピング連携 ‒ Cache Abstraction機能 ‒ 非同期実行/スケジューリング実行
• これからのJava EnterpriseとSpring~みんなの生き残り戦略 ‒ Spring 現状の問題と解決の術 ‒ Javaの方向性と生き残りの術(JavaOneから見えてきた)
3
Spring概要 SpringFrameworkからSpringへ!?
springsource.org
Spring • Spring Framework
‒ ロッド・ジョンソン氏(SpringSource[旧社名:Interface21])が中心に開発
‒ Java/JEEアプリケーション開発用フレームワーク • DIxAOPコンテナ
‒ ASL(Apache Software Licence) Ver2.0に基づいたオープンソース
6
Springの年譜 • 2002年11月 書籍:Expert One-on-One J2EE • 2004年3月 Spring 1.0 • 2004年9月 Spring 1.1 • 2005年5月 Spring 1.2 • 2006年10月 Spring 2.0 • 2007年11月 Spring2.5 • 2009年12月 Spring3.0 • 2011年12月 Spring3.1
‒ Java7, Spring Cache, Hibernate4... • 201x年 Spring3.2
‒ Hibernate4 FullSupport...
7
Springの主なプロジェクト • Spring Framework • Spring AMQP • Spring Android • Spring Batch • Spring BlazeDS • Spring Data • Spring Gemfire • Spring Integration
8
• Spring Mobile • Spring .NET • Spring Roo • Spring Security • Spring Security OAuth
• Spring Social • Spring Web Flow • Spring Web Services
springsource.com
Spring 開発-実行-管理 • 開発(Java Leadership)
‒ Spring ‒ Groovy&Grails ‒ SpringSource Tool Suite ‒ Cloud Foundary
• 実行(Application Platform) ‒ vFablic ERS ‒ vFablic tc Server ‒ vFablic RabitMQ ‒ vFablic GemFire
• 管理(Apllication Management) ‒ vFablic Hyperic
Grailsの代わりにSpring Roo • コマンドラインを利用してソースを自動生成するツール
‒ 生産性の向上及び仕様変更や機能追加にも耐えうる継続的な開発 ‒ Java界隈においてメジャーなフレームワークを利用 ‒ 自動生成した後もモデルクラスの変更に対して、ビューやコントロー
ラクラスが自動で再作成される
11
STS • SpringSource Tool Suite
‒ EclipseベースのSpringアプリケーション開発環境 ‒ 各種サーバへのデプロイ管理
cloudfoundry.com
vFabric • VMwareのソリューション
‒ クラウド向けのアプリケーション基盤(ミドルウェア) ‒ vSphere のメモリ管理機能を利用したコンピュータリソースの有効活用
‒ vCenter によるアプリケーションの監視 ‒ 仮想マシンの数に応じた価格体系を提供
vFabric
VMware
Spring + Application
vFabric • VMWare が提供するクラウド向けのアプリケーション基盤 ‒ AP サーバーやデータベースやメッセージキューなどのソフトウェアを1セットで提供する
‒ Springを使用することで仮想アプリケーションとクラウド アプリケーションの開発期間が最大 50 % 短縮
Hyperic (モニタリング と監視)
ERS(Enterprise Ready Server) Webサーバ
tc Server
RabbitMQ (メッセージング)
GemFire (データ管理)
ERS(Enterprise Ready Server) • Web サーバーとロードバランスの機能を提供
‒ Apache HTTP Server を使用 ‒ Apache と比較して最大 100% のパフォーマンスアップ
• 迅速にバグフィックスするサポートを提供 ‒ Apache HTTP Server のサポートを提供していた Covalent 社を SpringSource が買収
ERS
tc Server
tc Server
tc Server • エンタープライズ向けにカスタマイズされた Tomcat
‒ 開発者に馴染みの Tomcat互換 ‒ Springを利用して作成したアプリケーションを実行するのに適した環境
• Tomcat + α ‒ Webベースの管理UI ‒ アプリケーションの設定とデプロイ管理 ‒ パフォーマンスのモニターおよび状態の診断
ERS tc Server
ERS tc Server
ERS tc Server
ERS tc Server
Rabbit MQ
Rabbit MQ
RabbitMQ • AMQP(Advanced Message Queuing Protocol) を実装したメッセージキュー
• 多彩なメッセージングのパターンに対応 ‒ point-to-point, publishsubscribe,routing...
• 多彩なプロトコル、言語(クライアント側)に対応
RabbitMQ tc Server
Cloud時代のスケール メッセージBus
ERS
GemFire • メモリーベースの分散型のデータ管理プラットホーム(永続化も可能) ‒ Key-Value ストア ・マシンを動的に追加可能 ‒ 非同期のイベント通知
Cloud時代のスケール データストレージ
GemFire tc Server ERS
Hyperic • tc Serverの管理・監視・計測
‒ 他のミドルウェアや OS リソースも監視できる • 管理
‒ ランタイムインスタンスの起動・停止 ‒ JVM オプション・ JDBC データソースなどの設定 ‒ Web アプリケーションのデプロイ
• 監視 ‒ リソースの閲覧・監視・コントロール ‒ デッドロックの検知 ‒ ガベージコレクションの時間 ‒ JDBC データソースの監視
• 計測 ‒ instrumented 版の Spring Framework を利用し、 bean のメソッドの処理時間などを表示
Spring3.1 主な追加機能
21
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
22
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
23
Bean定義のプロファイル機能 • Bean定義をプロファイルという形でグループ化
‒ Bean定義の有効範囲を指定できる機能
24
<?xml version="1.0" encoding="UTF-8"?> <beans ・・・> <beans profile="test"> <bean id="dataSource" class="org.springframework・・・DriverManagerDataSource"> </bean> <bean ・・・ </beans> <beans profile="production"> <jee:jndi-lookup id="dataSource" jndi-name="・・・"/> <bean ・・・ </beans> </beans>
DIコンテナ作成時に指定 • DIコンテナの作成時にtestを指定
25
GenericXmlApplicationContext factory = new GenericXmlApplicationContext(); // プロファイルは複数選択可 factory.getEnvironment().setActiveProfiles("test"); factory.load("classpath:/META-INF/spring/beans.xml"); factory.refresh();
SpringJUnit4ClassRunnerで指定
26
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration ("classpath:/META-INF/spring/beans.xml") @ActiveProfiles("test") public class BeanProfileSpringTest { ・・・
• SpringJUnit4ClassRunnerを使用したテストクラスでtestを指定
Webアプリで指定(1)
27
<context-param> <param-name>spring.profiles.active</param-name> <param-value>production</param-value> </context-param>
• Webアプリケーションでtestを指定 ‒ ContextLoaderListenerの場合
web.xml
Webアプリで指定(2)
28
• Webアプリケーションでtestを指定 ‒ DispatcherServlet
<servlet> <servlet-name>dispatcherServlet</servlet-name> ・・・省略・・・ <init-param> <param-name>spring.profiles.active</param-name> <param-value>test</param-value> </init-param> ・・・省略・・・ </servlet>
web.xml
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
29
組込みデータベースサポート • 組込みデータベースをDIコンテナで管理
‒ DataSourceオブジェクトとしてアクセスすることができる機能
‒ データベースの起動/停止を意識することなくアプリケーションを実行可能
‒ メモリ上で起動、終了時には破棄 • テーブルやデータをSQLスクリプトファイルに記述
• Javaの軽量なデータベース ‒ HSQLDB(http://www.hsqldb.org/) ‒ H2(http://www.h2database.com/) ‒ Apache Derby(http://db.apache.org/derby/)
30
HSQLを利用
31
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd"> ・・・ <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:/META-INF/sql/ddl.sql"/> <jdbc:script location="classpath:/META-INF/sql/data.sql"/> </jdbc:embedded-database> ・・・ </beans> <jdbc:embedded-database id="dataSource" type="H2">
※type ="DERBY"
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
32
Object/XMLマッピング連携 • OXM(Object/XMLマッピング )共通のインタフェースを定義 ‒ Marshallerインタフェース
• Object→XML ‒ Unmarshallerインタフェース
• XML→Object
• 実装クラス ‒ JAXB(http://jcp.org/en/jsr/summary?id=222) ‒ Castor(http://castor.org/xml-framework.html) ‒ XMLBean(http://xmlbeans.apache.org/) ‒ JiBX(http://jibx.sourceforge.net/) ‒ XStream(http://xstream.codehaus.org/)
33
OXMサンプル
34
Spring MVC
Http Message Converter
:Customer
:Customer
XML
XML
HTTPリクエスト
HTTPレスポンス
メソッドの引数
メソッドの戻り値
Bean定義ファイル(JAXB利用)
35
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oxm="http://www.springframework.org/schema/oxm" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd">
<oxm:jaxb2-marshaller id="marshaller"> <oxm:class-to-be-bound name="sample.customer.biz.domain.Customer" /> </oxm:jaxb2-marshaller>
<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <property name="marshaller" ref="marshaller"/> <property name="unmarshaller" ref="marshaller"/> </bean>
</beans>
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
36
Cache Abstraction機能 • キャッシュを抽象化する機能
‒ アプリケーション開発者がキャッシュを管理するオブジェクトを全く意識することなくキャッシュを実現
‒ CacheManagerをBean定義ファイルに設定 ‒ アノテーションやBean定義でキャッシュを実現
37
SimpleCacheManagerの利用
38
<bean id="cacheManager" class="org.springframework.cache.support. SimpleCacheManager"> <property name="caches"> <list> <bean class="org.springframework.cache. concurrent.ConcurrentMapCacheFactoryBean"> <property name="name" value="users"/> </bean> <bean class="org.springframework.cache. concurrent.ConcurrentMapCacheFactoryBean"> ・・・省略・・・ </list> </property> </bean>
アノテーションの利用(1) • cache:annotation-drivenタグを設定
39
<?xml version="1.0" encoding="UTF-8"?> <beans ・・・省略・・・ xmlns:context="http://www.springframework.org /schema/context" xsi:schemaLocation=" ・・・省略・・・ http://www.springframework.org/schema/cache http://www.springframework.org /schema/cache/spring-cache-3.1.xsd">
<cache:annotation-driven />
・・・省略・・・
アノテーションの利用(2)
40
@Cacheable(value = "users", key = "#userId") public User findById(long userId){ ・・・省略(データベースアクセスなど)・・・
findById(..)
:User userId=001
:User userId=003
:UserTBL
userId="001"の場合
userId="009"の場合
アノテーションの利用(3)
41
@CacheEvict(value = "users", key = "#user.id") public void update(User user) { ・・・省略(データベースアクセスなど)・・・
update(..)
:User userId=001
:User userId=003
:UserTBL
userId="001"の場合
update
delete
Bean定義の利用 • キャッシュの設定をソースに書きたくない場合
42
<cache:advice id="cacheAdvice"> <cache:caching cache="users"> <cache:cacheable method="findById" key="#userId"/> <cache:cache-evict method="update" key="#user.id"/> ・・・省略・・・ </cache:advice>
主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行
43
非同期実行/スケジューリング実行 • アノテーションで非同期実行やスケジューリング実行が可能 ‒ @Asyncアノテーション ‒ @Scheduledアノテーション
44
Bean定義ファイル • task:annotation-drivenタグを設定
45
<?xml version="1.0" encoding="UTF-8"?> <beans ・・・省略・・・ xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" ・・・省略・・・ http://www.springframework.org/schema/task http://www.springframework.org/schema/ task/spring-task-3.1.xsd">
<task:annotation-driven/> ・・・省略・・・
非同期メソッド(戻りなし)
46
@Async public void foo() { ・・・
@Async public String foo() { ・・・ // 戻り値を指定してもnullしか戻らないので注意
非同期メソッド(戻りあり)
47
@Async public Future<String> foo() { ・・・ String result = ・・・ return new AsyncResult<String>(result); }
Future<String> asyncResult = object.foo(); ・・・ String result = asyncResult.get();
非同期メソッド
呼び出し/受け取り
スケジューリング
48
@Scheduled(fixedDelay = 5000) public void bar() { ・・・ //属性は1つしか指定できない
属性 説明
cron cron形式で指定したスケジュールに従って実行する 例)毎日12時に実行 cron = "0 0 12 * * ?"
fixedDelay 指定されたミリ秒の間隔でメソッドを実行する メソッドが実行されるまでの間隔は、前のメソッドが終了した時点からカウントされる
fixedRate 指定されたミリ秒の間隔でメソッドを実行する メソッドが実行されるまでの間隔は、前のメソッドが開始した時点からカウントされる
これからのJava EnterpriseとSpring
みんなの生き残り戦略
49
• Spring 現状の問題と解決の術 • Javaの方向性と生き残りの術(JavaOneから見えてきた)
50
• Spring 現状の問題と解決の術 • Javaの方向性と生き残りの術(JavaOneから見えてきた)
51
Springの現状 • 大手SIが標準アーキテクチャ(フレームワーク)のベースとして利用するなど、多くの企業で採用
• JSUG発表事例から ‒ CSK(当時) ‒ NTTデータ ‒ 日本UNISYS ‒ アクセンチュア
52
Spring利用時の問題点(昔) • Webアプリで、様々なクラスがApplicationContextを生成してクラスをgetしていた ‒ ネット連載の初回しか見なかったのか?
• 何でもかんでもInterfaceを付加してInjection(今でもちょっとある) ‒ 書籍や記事等で強調し過ぎた!?
• 「うちではそんな高度なフレームワークは使いこなせません」 ‒ これはちょっと…
53
Spring利用時の問題点(今) • Spring3なのにSpring1
‒ 勉強不足です… • 「Rooを使えばCOBOLERだけでもレガシーマイグレーション可能ですよね」 ‒ 過信しすぎ…
• ビジネスロジックの作りの酷さが目立つようになってきた ‒ WebやDAOなど全体的に奇麗になってきたので、余計に目立つ
54
これからSpringを使うには • ドメインモデリング重要
‒ 責務が明確で、分かり易く、変化に対応できるビジネスロジック • トランザクションスクリプトからドメインモデルへリファクタリングすることも、ひとつの手としはアリかも!?
• 例:トランザクション内に分散したValidationをエンティティに移動する
‒ Springが得意とするレイヤ間の疎結合は、その前提
‒ DDDは教材の1つとして有効
55
• Spring 現状の問題と解決の術 • Javaの方向性と生き残りの術(JavaOneから見えてきた)
56
Javaの目指すところ • JavaOneで見えてきた、クラウドへの道
‒ Cloud Device+PaaS
57
Cloud
JavaEE • JavaEE7
‒ 標準的なPaaSの提供を目指す • クラウド環境に対応した自動プロビジョニングや、多岐にわたる参加者の管理モデルも提唱
‒ JDK(Project Lambda) • JDK8 2013年
‒ 使い易くなるキャッシュ機能(JCache 1.0) ‒ 既存のAPIにはマルチテナント対応の拡張(JPA2.1)
‒ コンポーネントの容易な組み合わせ(CDI 1.1)
58
PaaS
JDK8(Project Lambda) • 関数型の採用 • マルチコア対応
59
(int x, int y) -> x + y
() -> 42
(String s) -> { System.out.println(s); }
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html
JCache • 分散環境でデータをキャッシュすることにより、アプリケーションの性能と拡張性を確保することができる
• Cacheに大事なものをしまって、キーを与える ‒ CacheManager, CacheFactory
60
キャッシュ
APサーバ
データベース
Contexts and Dependency Injection • コンポーネントを簡単に組み合わせる仕組み ‒ 仕様の異なるコンポーネントを、組み合わせるのが大変だった • @Inject
‒ Web Beans • JBoss Seam
61
EJB JSF JPA
CDI
JPAのマルチテナント対応 • SaaSの効率を高める仕組み
‒ マルチテナンシー(マルチテナントの性格をもつ)なアプリケーション
• アノテーションと設定ファイルでテナントを使い分け ‒ @Multitenant、@TenantDiscriminatorColum
62
AP AP AP AP
GlassFish • Java EEのリファレンス実装
‒ JavaEE7 → GlassFish4 ‒ 2013年第2四半期ころに登場予定 ‒ 他のAP Serverの対応状況は不明
63
3.1.2 4
2013 2012
Spring+αで十分 • Spring3.1 ‒ Cache(JCache) ‒ DIxAOP(CDI)
• Scala ‒ 関数型(Lambda)
• Hibernate4 ‒ マルチテナンシー(JPA)
64
新SSH
まとめ
65
中心にはSpring • やっぱりまだまだSpring
66
Cloud
Spring
Java
Hight
Low
CM まだまだSpringだと思った貴方へ
67
JSUG勉強会 • 是非ご参加下さい
‒ 2ヶ月に1回あれば良い程度に開催 ‒ MLにてお知らせ
• http://groups.google.co.jp/group/jsug • 発表者求む!
‒ ご連絡ください:[email protected]
68
8月頃発売予定 • Spring入門 3.1対応版(技術評論社)
69
Now Printing
BON VOYAGE!
70